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 相关文章推荐
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
跨域传值即主页面与iframe之间互相传值
Dec 09 Javascript
jQuery简易图片放大特效示例代码
Jun 09 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
Mar 02 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
May 12 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
js a标签点击事件
Mar 30 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
简谈创建React Component的几种方式
Jun 15 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
Jun 17 Javascript
详解uniapp的全局变量实现方式
Jan 11 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基于单例模式实现的数据库操作基类
2016/01/15 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
javascript parseInt 大改造
2009/09/27 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
自己使用总结Python程序代码片段
2015/06/02 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
益模软件Java笔试题
2012/03/27 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
中学生评语大全
2014/04/18 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
科技活动周标语
2014/10/08 职场文书
2014年信用社工作总结
2014/11/25 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers