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 相关文章推荐
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
Jan 09 Javascript
jquery随意添加移除html的实现代码
Jun 21 Javascript
js跑步算法的实现代码
Dec 04 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
Jun 03 Javascript
利用Vue.js指令实现全选功能
Sep 08 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
ES6 中可以提升幸福度的小功能
Aug 06 Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
深入解析koa之中间件流程控制
Jun 17 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中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
Python中的延迟绑定原理详解
2019/10/11 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
工商技校毕业生自荐信
2013/11/15 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
总经理岗位职责
2015/02/04 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python