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读取xml
Nov 04 Javascript
jQuery 获取URL参数的插件
Mar 04 Javascript
Javascript图像处理思路及实现代码
Dec 25 Javascript
javascript引用赋值(地址传值)用法实例
Jan 13 Javascript
javascript中的altKey 和 Event属性大全
Nov 06 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 Javascript
JavaScript实现省市县三级级联特效
May 16 Javascript
Javascript 编码约定(编码规范)
Mar 11 Javascript
iview table render集成switch开关的实例
Mar 14 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 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去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
详解Python3中yield生成器的用法
2015/08/20 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Python实现对adb命令封装
2020/03/06 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
产品销售员岗位职责
2013/12/18 职场文书
精彩的英文自荐信
2014/01/30 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
结婚周年感言
2014/02/24 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
党章培训心得体会
2014/09/04 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS