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+thickbox仿校内登录注册框
Jun 07 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
JavaScript面向对象之Prototypes和继承
Jul 12 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
Feb 13 Javascript
在Ubuntu系统上安装Node.JS的教程
Oct 15 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
由浅入深剖析Angular表单验证
Jul 14 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
Jan 04 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 Javascript
vue 中filter的多种用法
Apr 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 curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
PHPThumb图片处理实例
2014/05/03 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
JS获取时间的方法
2015/01/21 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
中国文明网签名寄语
2014/01/18 职场文书
2014年党委工作总结
2014/11/22 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
旅游项目合作意向书
2015/05/08 职场文书
紫日观后感
2015/06/05 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang