关于 Javascript 的闭包理解
2013-04-18 11:25
302 查看
关于 Javascript 的闭包,先前百度了一些关于闭包的文章,看了个大概,没全明白。昨日又提到这个话题,和好友交流了一下,重新理解,现做个总结,记录一下。
关于 Javascript 的闭包,主要是看的这篇文章:/article/1257211.html
以下面是我自己对闭包的理解:
通常情况下,函数内的变量生存周期在函数被调用之后就终止,比如下面的代码:
第二次调用 a() 的时候,系统重新给 i 分配内存空间,根据函数定义构建 i 的值:100,执行了 ++i 之后所以输出仍然是 101。
如果想保留函数里 i 的值,通过以下代码可以实现:
原因 :
1. a() 内部定义了一个新函数 b() , b() 在自己的作用域里面没有找到 i 这个变量,就会在父作用域里寻找,也就是说 b() 是可以 访问 a() 里面的 i 这个变量的;
2. a() 的返回值是返回 b() ,这里 b() 对 i 有引用,当将 a() 的返回值赋值给 c 的时候,系统为了保证 c 的存在,就会保持 b ,而 b 又对 i 引用了, 所以又会保持 i ,这样 i 的值就保持下来了。
引用上面文章里的图片
![](http://img.my.csdn.net/uploads/201304/18/1366254633_4667.jpg)
这里的 b 就是闭包,只要 c 存在, c 所对应的 i 的值就会一直存在。
关于闭包的作用,我的一点浅薄理解是:
可以保存函数体内的变量值,相当于对象里的成员变量,而且其他方式都不可访问这个值,只能通过 c 来访问。类似于对象里面的私有成员, c 是这个对象的一个外部的接口。
其实要达到这个要求,可以直接通过对象的私有变量来实现,但是我对 Javascript 的了解非常有限,现在只知道 Javascript 好像没有类这个概念,构造对象的方法和其他大多数面向对象语言(比如 C++)不一样,可能构造私有成员的方法有什么限制。
闭包的其他应用,暂时还没想到,以后如果遇到了,再写一点。
在本文开头提到的那篇文章里还有一个例子,到现在都没有理解透彻:
javascript是动态(或者动态类型)语言,this关键字在执行的时候才能确定是谁。所以this永远指向调用者,即对‘调用对象‘者的引用。(原文地址:http://zhidao.baidu.com/question/412806025.html)
这里是不是这样理解,因为 alert(object.getNameFunc()()); 是在最外层调用的,所以这里的 this 指的是 window。
但是我把调用放到一个我自己的对象里面,输出仍然是 The Window:
只能说 Javascript 水很深,搞懂 Javascript 不易,学无止尽啊……
关于 Javascript 的闭包,主要是看的这篇文章:/article/1257211.html
以下面是我自己对闭包的理解:
通常情况下,函数内的变量生存周期在函数被调用之后就终止,比如下面的代码:
function a() { var i = 100; alert(++i); } a(); // 101 a(); // 101两次执行 a(),输出都是 101,这是因为每次调用函数 a() 之后函数 a() 就没有被任何对象引用,这时 Javascript 的 GC 就会回收这个函数里的资源,包括 i 。
第二次调用 a() 的时候,系统重新给 i 分配内存空间,根据函数定义构建 i 的值:100,执行了 ++i 之后所以输出仍然是 101。
如果想保留函数里 i 的值,通过以下代码可以实现:
function a() { var i = 100; function b() { alert(++i); } return b; } var c = a(); c(); // 101 c(); // 102以上的输出,第一次是 101 ,第二次是 102 ,f1() 内部变量 i 的值保留下来了。
原因 :
1. a() 内部定义了一个新函数 b() , b() 在自己的作用域里面没有找到 i 这个变量,就会在父作用域里寻找,也就是说 b() 是可以 访问 a() 里面的 i 这个变量的;
2. a() 的返回值是返回 b() ,这里 b() 对 i 有引用,当将 a() 的返回值赋值给 c 的时候,系统为了保证 c 的存在,就会保持 b ,而 b 又对 i 引用了, 所以又会保持 i ,这样 i 的值就保持下来了。
引用上面文章里的图片
![](http://img.my.csdn.net/uploads/201304/18/1366254633_4667.jpg)
这里的 b 就是闭包,只要 c 存在, c 所对应的 i 的值就会一直存在。
关于闭包的作用,我的一点浅薄理解是:
可以保存函数体内的变量值,相当于对象里的成员变量,而且其他方式都不可访问这个值,只能通过 c 来访问。类似于对象里面的私有成员, c 是这个对象的一个外部的接口。
其实要达到这个要求,可以直接通过对象的私有变量来实现,但是我对 Javascript 的了解非常有限,现在只知道 Javascript 好像没有类这个概念,构造对象的方法和其他大多数面向对象语言(比如 C++)不一样,可能构造私有成员的方法有什么限制。
闭包的其他应用,暂时还没想到,以后如果遇到了,再写一点。
在本文开头提到的那篇文章里还有一个例子,到现在都没有理解透彻:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; // this === window }; } }; alert(object.getNameFunc()()); // The Windowreturn this.name 这里的 this 是 window,百度之后搜到这样一个解释:
javascript是动态(或者动态类型)语言,this关键字在执行的时候才能确定是谁。所以this永远指向调用者,即对‘调用对象‘者的引用。(原文地址:http://zhidao.baidu.com/question/412806025.html)
这里是不是这样理解,因为 alert(object.getNameFunc()()); 是在最外层调用的,所以这里的 this 指的是 window。
但是我把调用放到一个我自己的对象里面,输出仍然是 The Window:
name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; var object1 = { name : "The Object1", test : function() { alert(object.getNameFunc()()); alert(this.name); } } object1.test(); // The Window照上面那句话来说,这里的 this 应该是调用者 object1 ,但是输出仍然是 The Window,搞不懂啊。
只能说 Javascript 水很深,搞懂 Javascript 不易,学无止尽啊……
相关文章推荐
- javascript执行上下文、作用域与闭包(第七篇)---关于闭包典型例子的理解
- javascript 关于闭包的解释与理解
- JavaScript关于作用域、作用域链和闭包的理解
- JavaScript关于闭包,匿名函数,this,对象等的一些理解
- JavaScript关于作用域、作用域链和闭包的理解
- 关于javascript中闭包的理解
- 关于Javascript 闭包的理解
- JavaScript高级程序设计 Chapter 7 关于函数、闭包的笔记和理解
- 对JavaScript中闭包的一些理解
- 理解JavaScript 闭包
- 深入理解javascript作用域和闭包
- 深入理解javascript原型和闭包系列 深入理解javascript原型和闭包(5)——instanceof
- 理解 JavaScript 闭包
- 用环境模型来理解javascript中的闭包
- 深入理解javascript原型和闭包(10)——this
- 深入理解javascript原型和闭包(5)——instanceof
- 关于闭包,巧妙地抽象理解
- javascript深入理解js闭包
- javascript深入理解js闭包
- javascript:深入理解闭包——转自http://www.jb51.net/article/24101.htm