最近在Stackoverflow上看了一个关于闭包的回答:
http://stackoverflow.com/a/111200/3187638回答中有一句话:`A function doesn't have to return in order to be called a closure`,翻译下来就是说函数没有任何返回的时候就被称为闭包,例如:
```
function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp)); // will alert 16
}
bar(10);
}
foo(2);
```
内部函数bar没有任何返回,只有执行逻辑代码,按照这个回答这里就创建了一个闭包。
Javascript中闭包的特性是内部作用域可以访问外部作用域的数据,反之则不行,又及闭包是常驻内存的,不会被Javascript解释引擎的垃圾回收机制删除,如果按照上面的对创建闭包的定义,我们队下面的代码进行如下修改:
```
function foo(x) {
var tmp = 3;
function bar(y) {
return {
doAdd: function (){
console.info(x + y + (++tmp));
},
getTmp: function (){
console.info(tmp);
}
}
}
var obj = bar(10);
obj.doAdd(); // 输出16
obj.doAdd(); // 输出17
obj.getTmp(); // 输出5
}
foo(2);
```
我对内部函数bar进行了修改,使其返回了一个包含两个方法的对象,执行函数,执行返回对象中的doAdd方法两次,然后执行对象中的getTmp方法,注意输出的值的变化。也就是说即使内部返回了数据这里的闭包依然存在的,并没有消失。
我不知道是我这里理解错了,还是答主这句话真的不是很正确,还请大家给些建议。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/119361
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.