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 相关文章推荐
限制复选框的最大可选数
Jul 01 Javascript
js常见表单应用技巧
Jan 09 Javascript
利用jQuery的$.event.fix函数统一浏览器event事件处理
Dec 21 Javascript
jquery实用代码片段集合
Aug 12 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
javascript实时显示当天日期的方法
May 20 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
jQuery中的一些小技巧
Jan 18 Javascript
JavaScript ES6中export、import与export default的用法和区别
Mar 14 Javascript
JSON对象转化为字符串详解
Aug 11 Javascript
JS中的防抖与节流及作用详解
Apr 01 Javascript
javascript for循环性能测试示例
Aug 07 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 什么是PEAR?(第三篇)
2009/03/19 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
基于jQuery的获取标签名的代码
2012/07/16 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
pyqt5中动画的使用详解
2020/04/01 Python
django使用JWT保存用户登录信息
2020/04/22 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
会计学应届毕业生推荐信
2013/11/04 职场文书
推荐信怎么写
2014/05/09 职场文书
工程材料采购方案
2014/05/18 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
复兴之路观后感
2015/06/02 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书