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。

上一篇:变量对象vs活动对象


下一篇:(转)C# 解析 json