1、参数传递:ECMAScript中所有函数的参数都是按值传递的,也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样,基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用变量的复制一样。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,即arguments对象中的一个元素,在向参数传递引用类型的值时,会把这个值在内存的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。 2、作用域链:函数的作用域范围。 3、在JavaScript中,if语句和for语句中的变量声明会将变量添加到当前的执行环境,例如for语句创建的变量i即使在for循环结束后,也依旧会在循环外部的执行环境中;在if语句中块级作用域中定义的变量,在块级作用域结束后仍可以使用。 4、变量声明:使用var声明的变量会自动被添加到最近的环境中,若在函数内部,最近的环境就是函数的局部环境,在with语句中,最近的环境就是函数环境,若初始化变量没有使用var声明,则该变量会自动被添加到全局变量中。 5、查询标识符:搜索过程从作用域链的前端开始,逐级向上查询,若在局部环境中找到则搜索停止,若在局部环境中未找到则沿着作用域链向上找,直到在全局环境中找到变量对象,若在全局环境中没有找到,则该变量尚未声明。变量查询也是有代价的,访问局部变量比访问全局变量要快,因为不用向上搜素。 6、垃圾收集:离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除;标记清除是目前主流的垃圾收集算法,该算法的思想是给当前不使用的值加上标记,然后再回收其内存;另一种垃圾收集算法是引用标数,该算法的思想是跟踪记录所有值被引用的次数,js引擎目前都不再使用这种算法,但是在IE中访问非原生js对象时,该算法会导致问题。当代码存在循环引用现象时,引用计数算法会导致问题。解除变量的引用不仅有助于消除循环变量引用现象,而且对垃圾收集也有好处,为了确保有效回收内存应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。
code: https://github.com/tamir2017/JavaScriptLearnDemo/tree/master/chapter4