Javascript 设计模式(二) 闭包


Posted in Javascript onMay 26, 2010

正文

闭包的概念:

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

最常见的闭包

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 相关文章推荐
javascript操作cookie的文章(设置,删除cookies)
Apr 01 Javascript
火狐textarea输入法的bug的触发及解决
Jul 24 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
May 11 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
node.js入门学习之url模块
Feb 25 Javascript
深入理解vue-router之keep-alive
Aug 31 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
js消除图片小游戏代码
Dec 11 Javascript
微信小程序实现天气预报功能(附源码)
Dec 10 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
May 26 #Javascript
js escape,unescape解决中文乱码问题的方法
May 26 #Javascript
javascript 异步页面查询实现代码(asp.net)
May 26 #Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
May 26 #Javascript
jquery的$(document).ready()和onload的加载顺序
May 26 #Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
May 26 #Javascript
jQuery select操作控制方法小结
May 26 #Javascript
You might like
discuz安全提问算法
2007/06/06 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP的5个安全措施小结
2012/07/17 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
php单例模式的简单实现方法
2016/06/10 PHP
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Django中处理出错页面的方法
2015/07/15 Python
python更新列表的方法
2015/07/28 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
python3.5绘制随机漫步图
2018/08/27 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python tkinter基本属性详解
2019/09/16 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
Python学习笔记之装饰器
2020/08/06 Python
董事长秘书职责
2014/01/31 职场文书
献爱心倡议书
2014/04/14 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
大学生简短的自我评价
2014/09/12 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript