我正在阅读对答案的评论并看到 this comment :
[the closure] doesn't persist the state of foo so much as creates a special scope containing (1) the returned function and (2) all the external variables referenced at the time of the return. This special scope is called a closure.
好的,到目前为止一切顺利。现在这是我不知道的有趣部分:
Case in point... if you had another var defined in foo that was not referenced in the return function, it would not exist in the closure scope.
我想这是有道理的,但是这除了内存使用/性能还有什么意义?
问题 -- 如果作用域中的所有变量都包含在闭包中,那将允许我做什么我不能用当前模型做的事情?
最佳答案
我认为您从字面上理解了该评论。评论只是说你不能在函数范围之外访问它(它不是公开访问的),而不是它在函数内根本不可用。无论如何,返回的函数都可以访问所有外部函数范围。如果内部函数不提供访问它的方法,您就无法在外部函数外部访问该范围。
例如,这个表达式的计算结果为 4:
function testClosure(){
var x = 2;
return function(y){
alert(eval(y));
}
}
var closure = testClosure();
closure("x+2"); //4
所以 x
尽管没有被直接引用也是可用的
进一步研究
看来 chrome 和 firefox 至少尝试优化这一点,如果你不提供任何方式来引用 x
变量,它就不会显示为可用在调试器中。在闭包内使用断点运行此代码会显示 x
在 Chrome 26 和 Firefox 18 上不可用。
但这只是一个内存管理细节,而不是语言的相关属性。如果有任何可能的方法可以引用该变量,它就会被传递,我怀疑其他浏览器可能不会以相同的方式优化它。根据规范编写代码总是比根据实现编写代码更好。在这种情况下,虽然规则实际上是:“如果有任何可能的方式让您访问它,它将可用”。而且,不要使用 eval,因为它确实会使您的代码无法优化任何东西。
关于javascript - 深入理解 Javascript 中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801471/