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的url解析函数封装
Jun 28 Javascript
浅谈javascript的闭包
Jan 23 Javascript
Vue-resource实现ajax请求和跨域请求示例
Feb 23 Javascript
js实现图片左右滚动效果
Feb 27 Javascript
ES6中Generator与异步操作实例分析
Mar 31 Javascript
详解Angular路由 ng-route和ui-router的区别
May 22 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
Jul 24 Javascript
详解webpack3编译兼容IE8的正确姿势
Dec 21 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
Dec 03 Javascript
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
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 has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
总结对比php中的多种序列化
2016/08/28 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
checkbox勾选判断代码分析
2014/06/11 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
Python深入学习之闭包
2014/08/31 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
python修改字典内key对应值的方法
2015/07/11 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
python写日志文件操作类与应用示例
2019/07/01 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
美国轮胎网站:Priority Tire
2018/11/28 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
老师的检讨书
2014/02/23 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
高考学习决心书
2015/02/04 职场文书
大学生自荐书范文
2015/03/05 职场文书
毕业证明书
2015/06/19 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书