javascript - 深入理解 Javascript 中的闭包

标签 javascript closures

我正在阅读对答案的评论并看到 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

http://jsfiddle.net/dmRcH/

所以 x 尽管没有被直接引用也是可用的

进一步研究

看来 chrome 和 firefox 至少尝试优化这一点,如果你不提供任何方式来引用 x 变量,它就不会显示为可用在调试器中。在闭包内使用断点运行此代码会显示 x 在 Chrome 26 和 Firefox 18 上不可用。

http://jsfiddle.net/FgekX/1/

但这只是一个内存管理细节,而不是语言的相关属性。如果有任何可能的方法可以引用该变量,它就会被传递,我怀疑其他浏览器可能不会以相同的方式优化它。根据规范编写代码总是比根据实现编写代码更好。在这种情况下,虽然规则实际上是:“如果有任何可能的方式让您访问它,它将可用”。而且,不要使用 eval,因为它确实会使您的代码无法优化任何东西

关于javascript - 深入理解 Javascript 中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801471/

相关文章:

javascript - PHP mysqli执行不返回值

closures - 如何将捕获的变量移动到闭包内的闭包中?

ios - Swift 需要关闭音频播放器

Javascript:始终在执行上下文中执行函数

javascript - 在 XMLHttpRequest 事件处理程序中找不到字符串函数 (subStr)

javascript 列表转 HTML 列表

javascript - 如何在jquery中附加内容和afterAppending函数

javascript - 自动单击 slider 上的元素符号以使 slider 自动播放

javascript - 单击一次解除右键单击绑定(bind)

javascript - 实现功能—— spy