js_笔记_8月7日记录_活动对象_作用域链_按值传递
活动对象:简单说就是这个函数的参数和显示声明的变量或函数。
函数内接受的参数实际是创建了一个局部变量:【形参名】 = 【传进来的值】,js的函数传参只传值。
作用域链:执行流进入一个函数,会先创建出作用域链来,作用域链大概就是这样
本函数的活动对象--->父函数的活动对象--->父函数的父函数的活动对象--->父函数的父函数的父函数的活动对象--->直到全局活动对象【全局没有参数】
按值传递:js中参数是按值传递的,对基本类型好理解,函数内不能修改函数外的变量;
var a = 10;
function fn(a){
a = 100;
} console.log(a); //undefined
对于引用类型就不好理解,如果传一个值为对象的变量给函数,函数内部还是可以修改这个对象的属性,但不能重赋值
var b = {
q:10
} function fn(b){
b.q = 20;
b = new Object();
b.q = 100;
} fn(b);
console.log(b.q);
理解:所谓传值就是说传【右值】,a = 10的右值就是10;
对于对象,代码中new了一个对象,堆中就划分了一块区域属于这个对象,然后返回指针地址 ---> var a = new Object(); new Object()是告诉浏览器“我要一块地”,浏览器划 分好后把地址告诉a“这块地在0x12345678”,于是var a = 0x12345678,每次操作这个对象【例如:a.name = '蜜蜂老牛黄瓜'】就是顺着这个地址去到内存中操作( 便于理解 )的。
然后如果把【a】传给【fn(a)】(强调:传参只传值,右值),就是传了0x12345678给函数,这应该就是《高程》上说的传值,这就解释上门的代码为什么可以 b.q = 20; 修改到外面的变量,因为它是顺着地址去到内存中操作的;而因为函数内部的形参是局部变量的左值,实参是右值,所以 b = new Object(); 就是把右值改了,操作b就相当于操作这个右值,这个新的b会在函数执行完毕后立即销毁。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一切皆对象,对象是属性的集合,对象是由函数创建的,函数也是对象。
理解:只要是属性的集合就可以说它是对象,函数天生自带一个属性,这个属性的值是个对象( 另一个属性的集合 ),这个对象一开始只有一个属性,这个属性指向函数本身。
所以 typeof function的时候看的是这个函数的原型的属性的对象的第一个属性的值,函数本身,所以返回function;typeof 其他的对象可能,其他对象的原型里面有一些可以让typeof识别的,所以返回object。
最新文章
- NXP恩智浦P89V51RB2/RC2/RD2单片机解密芯片破解方法!
- Computer Vision: OpenCV, Feature Tracking, and Beyond--From <;<;Make Things See>;>; by Greg
- cocos2d-x quick 学习 一 环境
- foreach---集合已修改;可能无法执行枚举操作。
- 生成大小为100的数组,从1到100,随机插入,不连续,也不重复[C#]
- VB.Net 字符串加密类
- java IO复习(三)
- Candy 解答
- GDAL显示线性shp文件
- Linux系统学习笔记之 1 一个简单的shell程序
- 读取sd卡下图片,由图片路径转换为bitmap
- SpringMVC之Controller传递JSON数据到页面
- python之路: 基础篇
- Java 垃圾回收算法
- 盼盼Degenerate——清除浮动的方法
- 数位dp-Bomb
- iFace安全专家揭秘:存放在区块链钱包中的比特币,其实已经早就不属于你……
- MySQL5.7 的GTID复制
- L2-007. 家庭房产(并查集)*
- ros pluginlib 段错误