JS_ 垃圾回收、变量与属性、作用域链

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》总结笔记

 

posted on 2016-01-06 22:46  HandyWang  阅读(778)  评论(2编辑  收藏  举报

导航