0

If we have this basic function (and its closures):

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

Is this what's happening in memory? (basically a pointer to a function object and its scope chain) function diagram
(source: geraldleroy.com)

Is the above diagram correct? If so, I'm not understanding why these two lines of code create two new scope chains and new private variables:

var c = counter();

var d = counter();

It seems like both c and d would refer to the original function object and would use its scope chain.

I'm a little confused and would appreciate any insight on this that anyone can offer.

Thanks!

4

3 回答 3

1

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

您的return语句包含一个对象文字。所以每次counter调用都会在内存中创建一个新对象。

于 2014-07-23T07:12:47.217 回答
0

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

于 2014-07-23T07:15:27.787 回答
0

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

于 2014-07-23T07:08:05.023 回答