为什么此函数的新调用会创建新的作用域链和新的私有变量?

时间:2014-07-23 06:51:08

标签: javascript closures scope-chain

如果我们有这个基本功能(及其闭包):

function counter(){
    var n = 0;
    return {
        count: function() {return n++},
        reset: function() {n = 0}
    };
}

在记忆中发生了什么? (基本上是指向函数对象及其作用域链的指针) function diagram http://www.geraldleroy.com/function-diagram.jpg

上图是否正确?如果是这样,我不明白为什么这两行代码会创建两个新的作用域链和新的私有变量:

var c = counter();

var d = counter();

似乎c和d都会引用原始函数对象,并使用范围链。

我有点困惑,并希望任何人都可以提供任何洞察力。

谢谢!

3 个答案:

答案 0 :(得分:1)

范围链在这里并不真正适用。查找执行上下文'和'激活对象'了解调用函数时发生的情况。请参阅http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

上的这些概念的简短摘要

您的return语句包含一个对象字面值。因此,每次调用counter时,都会在内存中创建一个新对象。

答案 1 :(得分:0)

Java脚本是词法范围的'。 这意味着它们在定义它们的范围内运行,而不是它们的执行范围。定义2个变量定义来获取函数返回的对象,因此你得到2个作用域。

答案 2 :(得分:0)

基本上这里发生的是,当你调用函数counter()时 - 创建了新的私有计数器 - n和一个包含两个可以访问该私有变量的函数的对象,所以在返回之前它不能被处理掉对象没有被破坏。你的函数中的所有东西都没有绑定到任何东西,这意味着如果你要返回的对象将被定义在其他地方并且你只返回它的引用 - 这个函数会创建新的计数器n,你的对象现在参考新的计数器n,但旧计数器将被处理掉。