犀牛书第五版读书笔记——Chapter 4. Variables

1.javascript中的变量范围只有2种:全局变量和函数局部变量,不存在blockscope。

2.变量有原始类型和引用类型的区别。原始类型的赋值是值复制,引用类型的赋值是引用复制。

3.javascript中也有垃圾回收机制

var s = "hello";          // Allocate memory for a string
var u = s.toUpperCase( );  // Create a new string
s = u;                    // Overwrite reference to original string

上述代码执行完毕以后,字符串"hello"成为不可触及的,稍后会被垃圾回收机制释放空间。垃圾回收机制和闭包有很大关系。

4.javascript解释器启动后,在执行任何javascript代码之前,它首先创建一个全局对象(globalobject)。所有的全局变量和函数外部定义的function,都成为它的属性和方法。

5.当一个函数被调用时,则创建一个调用对象(callobject)。所有的局部变量和函数参数,都成为它的属性,嵌套函数则成为它的方法。调用对象的声明周期比全局对象短,但起到的作用是一样的。

6.结合4和5,可以得知,javascript中所有的变量和函数,其实都是某个对象的属性(property)和方法(method)。

7.每次当javascript解释器开始执行一个函数后,它为函数创建一个新的执行上下文(executioncontext)。

8.每个executioncontext都有一个关联的scopechain。scopechain是一个对象列表,当javascript查找变量时,就自底向上进行查询。如果是最外层的code,则其scopechain上只有一个globalobject。如果是最外层的function,则其scopechain上有2个对象,先是callobject(包含局部变量和参数),然后是globalobject。内层嵌套的function,则有3个对象,第一个是自身的callobject,第二个是外层function的callobject,最后才是globalobject。由于这个机制,所以代码可以访问到外围的变量,不能访问到内部嵌套的变量。