1.垃圾回收
js的垃圾回收机制不同于java,c等语言需要手工回收,js中的垃圾回收是自动启动的,大致过程:js解释器会判断一个对象是否是可达的,即是否有变量指向它,没有,则启动回收机制,释放该对象占用的内存,eg:
1 var s = "hello world"; 2 var s2 = s.toUpperCase();//创建新字符串:"HELLO WORLD" 3 s2 = s;//"hello world"没有变量指向,占用内存被释放
这样,写js代码时就没有后顾之忧了,即使定义了很多垃圾对象,js解释器也会自动回收,保证内存的高效利用
2.变量与属性
观念的转变:js中变量就是属性
①全局对象 当js解释器未执行任何代码前,先会创建全局对象:global object,可以用this 或者 window获取对该全局对象的引用,该对象的n多个属性指向了n个变量或者方法,如 this.parseInt();指向方法,this.Infinity指向了一个无穷大的变量,当我们定义一个全局变量时,改变量默认就是全局对象的一个属性
②局部对象 function内部定义的变量,即局部变量,实际为局部对象call object的属性,同上,该对象的属性也会指向n个变量(局部)甚至内部嵌套function的引用
3.作用域链--scope chain
首先提到一个概念,执行上下文,即js执行脚本的执行环境,不属于任何function的js代码在一个全局执行上下文中执行,该环境下是全局对象 global object;function 内部的代码在局部的执行上下文下执行,该环境下有局部对象 call object
js中,执行上下文是与作用域链相关的,作用域链(scope chain)是一系列的对象,比如,js中要访问某个变量的值,那就去访问其作用域链的对象的属性,来看是否有与该变量一致的属性,具体流程是这样的,如下代码:
1 var x = 1; 2 function test1() { 3 var y = 2; 4 function test3() { 5 var z = 3; 6 } 7 }
全局变量x的执行上下文关联的scope chain 的对象仅为global object,访问x,则去访问全局对象是否有x属性,有,返回其值,没有,返回undefined;
局部变量y 的执行上下文关联的scopechain 的对象则有两个:其本身所在function的局部对象(call object),上一层的global object,访问y ,先看局部对象call object是否有该属性,有,返回值2,如果没有再访问全局对象,全局对象再没有该属性,返回undefined;
对于局部变量z,同理,其所在执行上下文的作用域链由三个对象组成,本身function所包含的call object,上层的call object,外层的global object ,访问其值时,遍历对象属性的过程同上,不再赘述。
今天学的这些东西,比较偏理论,但感觉有学到了很多新东西,希望对诸位有帮助
读《JavaScript---The Definitive Guide》总结笔记