javascript-闭包
作者:gcbeen
日期:2013年10月06日
一、如何从外部读取局部变量
在函数内部再定义一个函数
function func1() { var n = 999; function func2() { console.log(n); } return func; } var result = f1(); result(); // 999
这就是一个闭包。
闭包就是能够读取其他函数内部变量的函数。由于在javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
闭包就是将函数内部和函数外部连接起来的一座桥梁。
二、闭包的用途
闭包可以用在很多地方。最大的两个用处
- 读取函数内部的变量。
- 让函数内部变量的值始终保持在内存中。
function func1() { var n = 999; nAdd = function () { n += 1; }; function func2() { console.log(n); } return func2; } var result = func1(); result(); nAdd(); result();
在这段代码中,result实际上就是闭包func2函数。它一共运行了两次,第一次值是999,第二次的值是1000。这证明了,函数func1中的局部变量n一直保存在内存中,并没有在func1调用后被自动清除。
原因在于func1是func2的父函数,而func2被赋给了全局变量,这导致func2始终在内存中。而func2的存在依赖于func1,因此func1也始终在内存中,不会在调用结束后,被垃圾回收机制回收。
注意
nAdd = function () { n += 1; }
nAdd 是全局变量。nAdd的是一个匿名函数,这个匿名函数本身也是一个闭包。
三、使用闭包注意点
- 闭包会使得函数内部变量被保存在内存中。在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部改变父函数内部变量的值。所以,如果把父函数当作对象(object)使用,把闭包当作他的公用方法,把内部变量当作它的私有属性,这是一定不要随便改变父函数内部变量的值。
四、两个示例
var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { return function () { return this.name; }; } }; console.log(object.getNameFunc()()); // The Window
var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { var that = this; return function () { return that.name; }; } }; console.log(object.getNameFunc()()); // My Object
blog comments powered by Disqus