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获取flash对象与网上的有所不同
Apr 21 Javascript
c#+jquery实现获取radio和checkbox的值
Sep 12 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
jquery实现多屏多图焦点图切换特效的方法
May 04 Javascript
Bootstrap字体图标无法正常显示的解决方法
Oct 08 Javascript
基于Marquee.js插件实现的跑马灯效果示例
Jan 25 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 Javascript
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
jQuery length 和 size()区别总结
Apr 26 jQuery
使用watch在微信小程序中实现全局状态共享
Jun 03 Javascript
JS如何在不同平台实现多语言方式
Jul 16 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
利用 window_onload 实现select默认选择
2006/10/09 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
PHP实现文件下载详解
2014/11/27 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
python删除列表中重复记录的方法
2015/04/28 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
2013的个人自我评价
2013/12/26 职场文书
《散步》教学反思
2014/03/02 职场文书
公司建议书怎么写
2014/05/15 职场文书
安全宣传标语口号
2014/06/06 职场文书
销售员态度差检讨书
2014/10/26 职场文书
研究生简历自我评
2015/03/11 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python