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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
javascript实现获取字符串hash值
May 10 Javascript
javascript获取网页宽高方法汇总
Jul 19 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
Apr 29 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
Vue组件化通讯的实例代码
Jun 23 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
使用webpack打包koa2 框架app
Feb 02 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 Javascript
jQuery实现简易聊天框
Feb 08 jQuery
JS内置对象和Math对象知识点详解
Apr 03 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python实现的桶排序算法示例
2017/11/29 Python
python贪吃蛇游戏代码
2020/04/18 Python
python数值基础知识浅析
2019/11/19 Python
python 求定积分和不定积分示例
2019/11/20 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
自荐书模板
2013/12/19 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
成本会计岗位职责
2015/02/03 职场文书
岗位聘任报告
2015/03/02 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript