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 相关文章推荐
js ondocumentready onmouseover onclick onmouseout 样式
Jul 22 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
javascript最基本的函数汇总
Jun 25 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
如何提高javascript加载速度
Dec 26 Javascript
Ionic 2 实现列表滑动删除按钮的方法
Jan 22 Javascript
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
基于node.js实现微信支付退款功能
Dec 19 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 19 Javascript
Vue中用JSON实现刷新界面不影响倒计时
Oct 26 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实现定时执行任务的方法
2014/10/05 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
学习ExtJS Column布局
2009/10/08 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
javascript每日必学之继承
2016/02/23 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
Angular刷新当前页面的实现方法
2018/11/21 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
python strip()函数 介绍
2013/05/24 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
关于python 跨域处理方式详解
2020/03/28 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
服装销售人员求职自我评价
2013/09/26 职场文书
办公室岗位职责
2014/02/12 职场文书
环境保护建议书
2014/08/26 职场文书
法定代表人证明书
2014/11/28 职场文书
班主任先进事迹材料
2014/12/17 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
小学教师教学反思
2016/02/24 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL