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实现仿Windows关机效果
Mar 10 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
Dec 09 Javascript
在JS中最常看到切最容易迷惑的语法(转)
Oct 29 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
Aug 17 Javascript
JQueryEasyUI之DataGrid数据显示
Nov 23 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
JavaScript实现公历转农历功能示例
Feb 13 Javascript
js鼠标跟随运动效果
Mar 11 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 Javascript
JavaScript组合模式---引入案例分析
May 23 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
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
详解cordova打包成webapp的方法
2017/10/18 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python实现泊松图像融合
2018/07/26 Python
python如何实现代码检查
2019/06/28 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
Python同时迭代多个序列的方法
2020/07/28 Python
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
数控专业应届生求职信
2013/11/27 职场文书
对祖国的寄语大全
2014/04/11 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python