无法分辨“相似”代码之间的区别

时间:2019-03-22 21:38:52

标签: javascript

我有一个嵌套函数,可在父函数中重写一个变量。我尝试了两种不同的调用语法。两者都合法,但第二个却给出了不良结果。

我知道范围是在定义期间确定的,但这似乎无济于事,因为两个代码片段在我看来都是相同的。

var countUpFromZero = function() {
    var count = 0;
    return function() {
        return ++count;
    };
}();
countUpFromZero(); // Desirable result
var countUpFromZero = function() {
    var count = 0;
    return function() {
        return ++count;
    };
};
countUpFromZero()(); //Undesirable result

1 个答案:

答案 0 :(得分:4)

您的问题没有说,但我假设问题是当您多次调用函数 时会发生什么。问题很简单。通过定义以下内容,让我们进行一些更改:

var make_a_counter = function() {
    var count = 0;
    return function() {
        return ++count;
    };
};

现在,让我们在第一个示例中添加一个变量:

var counter = make_a_counter();
counter(); // returns 1
counter(); // returns 2

简单,对吧?您的第二个示例与此等效:

make_a_counter()(); // returns 1
make_a_counter()(); // returns 1, because you made a *new* counter!

除了在您提供的第一个示例中,您从未给make_a_counter命名,而是在定义的同时使用()来命名,因此只有可以曾经做过一个柜台。如果您延迟调用它,则可以根据需要创建任意数量的对象,并精确控制它们的持续时间。