Javascript 设计模式(二) 闭包
2010-05-26 00:00
375 查看
正文
闭包的概念:
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
最常见的闭包
解释上面代码前,先接受一个函数的创建和执行过程
第一步:定义函数,设置环境,创建作用域链(scope chain)现a为全局变量,则a的作用域链中只有window
第二步:执行a, 首先创建作用域(a.scope=a),然后创建活动对象(callObject),并将callObject放入a的作用域链的顶端,因此a的作用域链中含有两个对象(a和window)
第三步:在活动对象上添加一个arguments属性,保存调用a时的参数值
第四步:将形参和内部变量赋值到活动对象a上
javascriptGC原理:如果一个对象不再被引用,那么这个对象会被GC回收。如果两个对象无干扰的互相引用,那么这两个对象也会被回收。
总结:
1、首先定义a时,创建了a的作用域链(scope chain)
2、(var b=a())执行a时,创建作用域a.scope=a,并创建callObject对象添加a的作用域中
3、a对象上添加了arguments属性,并将i和return函数赋值给活动对象
4、执行a时将b指向了a的ruturn函数值,在b中又引用的a中的局部变量i,因此不符合GC的回收标准,活动对象a没有被回收,因此b访问i是第一次访问的对象,并且只有在b中才能访问
闭包的概念:
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
最常见的闭包
function a() { var i=0; return function(){ alert(i++); } } var b=a(); for(var i=0;i<3;i++){ b(); }
解释上面代码前,先接受一个函数的创建和执行过程
第一步:定义函数,设置环境,创建作用域链(scope chain)现a为全局变量,则a的作用域链中只有window
第二步:执行a, 首先创建作用域(a.scope=a),然后创建活动对象(callObject),并将callObject放入a的作用域链的顶端,因此a的作用域链中含有两个对象(a和window)
第三步:在活动对象上添加一个arguments属性,保存调用a时的参数值
第四步:将形参和内部变量赋值到活动对象a上
javascriptGC原理:如果一个对象不再被引用,那么这个对象会被GC回收。如果两个对象无干扰的互相引用,那么这两个对象也会被回收。
总结:
1、首先定义a时,创建了a的作用域链(scope chain)
2、(var b=a())执行a时,创建作用域a.scope=a,并创建callObject对象添加a的作用域中
3、a对象上添加了arguments属性,并将i和return函数赋值给活动对象
4、执行a时将b指向了a的ruturn函数值,在b中又引用的a中的局部变量i,因此不符合GC的回收标准,活动对象a没有被回收,因此b访问i是第一次访问的对象,并且只有在b中才能访问
相关文章推荐
- 【学习笔记javascript设计模式与开发实践(闭包和高阶函数)----3】
- javascript 设计模式之单体模式-闭包
- 【学习笔记javascript设计模式与开发实践(闭包和高阶函数)----3】
- javascript(面向对象,作用域,闭包,设计模式等)
- JavaScript进阶设计模式系列——基础篇——闭包(4)--闭包和面向对象的设计
- JavaScript进阶设计模式系列——基础篇——闭包(5)--命令模式的两种实现方式
- javascript 设计模式 学习笔记(三)--基础(闭包)
- Javascript 设计模式(二) 闭包
- JavaScript进阶设计模式系列——基础篇——闭包(2)--闭包和生命周期
- 深入理解JavaScript系列(36):设计模式之中介者模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- 深入理解JavaScript系列(26):设计模式之构造函数模式
- javascript 设计模式
- [设计模式] Javascript 之 观察者模式
- Javascript 设计模式学习之一 Constructor(构造器)模式
- javascript 设计模式-单例模式
- 深入理解JavaScript系列(27):设计模式之建造者模式
- 深入理解JavaScript系列(35):设计模式之迭代器模式
- 深入理解JavaScript系列(29):设计模式之装饰者模式
- js原生设计模式——2面向对象编程之闭包1