JS_ 垃圾回收、变量与属性、作用域链
2016-01-06 22:46
260 查看
1.垃圾回收
js的垃圾回收机制不同于java,c等语言需要手工回收,js中的垃圾回收是自动启动的,大致过程:js解释器会判断一个对象是否是可达的,即是否有变量指向它,没有,则启动回收机制,释放该对象占用的内存,eg:
这样,写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中要访问某个变量的值,那就去访问其作用域链的对象的属性,来看是否有与该变量一致的属性,具体流程是这样的,如下代码:
全局变量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》总结笔记
js的垃圾回收机制不同于java,c等语言需要手工回收,js中的垃圾回收是自动启动的,大致过程:js解释器会判断一个对象是否是可达的,即是否有变量指向它,没有,则启动回收机制,释放该对象占用的内存,eg:
var s = "hello world"; var s2 = s.toUpperCase();//创建新字符串:"HELLO WORLD" 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中要访问某个变量的值,那就去访问其作用域链的对象的属性,来看是否有与该变量一致的属性,具体流程是这样的,如下代码:
var x = 1; function test1() { var y = 2; function test3() { var z = 3; } }
全局变量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》总结笔记
相关文章推荐
- JS模块化规范CommonJS,AMD,CMD
- 什么是JS闭包
- JavaScript打字游戏 01
- JavaScript函数惰性载入
- 实现 jstl标签foreach 功能
- js中对字符串的处理
- TypeError: window.clipboardData is undefined
- JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP
- 仿百度图片浏览效果
- ExtJS远程数据-本地分页
- JavaScript的那些坑之变量提升
- [bzoj1014][JSOI2008]火星人prefix
- 如何安装chrome扩展,以json-handle
- json-lib——JsonConfig详细使用说明
- [html][javascript]动态增删页面元素
- JavaScript unescape() 函数详解
- JavaScript escape() 函数详解
- Senna.js – 速度极快的单页应用程序引擎
- js基本内容
- Javascript实现完美的运动动画框架