JS的作用域链
- 在一般情况下我们在最外层声明的变量作用域是全局作用域,全局作用域指的是在当前windows下面的一个。但是当有函数出现的时候,函数内部的作用域会脱离全局作用域,我们称之为局部作用域。
- 局部作用域中元素的调用我们遵循以下原则: 当我们需要寻找相关元素的值时,我们首先在函数内部的局部作用域中找,找不到时进入函数的上层作用域去寻找。那什么是函数的上层作用域呢?上层作用域的定义就是该函数声明的那个区域,在哪里声明就在哪里寻找。
关于引用类型
- 元素的类型分为基本类型(数值类型,字符串类型,布尔类型,null,undefined)和引用类型(函数,数组,对象,正则)
- 对于基本类型,其直接就是保存在栈内存中的;
-
对于引用类型,是保存在堆内存中的对象,变量中只是储存其地址的指针。
- 输出结果为1 {name:'jirengu' , age:2}
原因: f1(a)是将a的值赋给局部变量n ,然后对n再作运算,所以真实是对a没有影响。最后输出结果为a为1;f2(c)是将该对象的地址赋给obj,然后对obj.age进行操作实际上就是对堆中的内存进行操作,直接更改内存中的值,所以对象的age的值发生变化,此时对象中的age变成3;最后f1(c.age)是将内存堆总的值2赋给n,然后发生变化的只是局部变量n,内存堆中数据没有发生变化。 -
对于对象中变量有后缀的,诸如 obj.age等都可以认为是直接调用堆内存中的信息。
- 对于红线处,在函数中,可以不用return直接修改堆内存中的信息,然后调用时已经修改。