无法区分“相似”代码

问题描述 投票:0回答:1

我有一个嵌套函数,它在父函数中重写一个变量。我尝试了两种不同的调用语法。两者都合法,但第二个会产生不良后果。

我知道范围是在定义期间确定的,但这似乎没有帮助,因为两个代码片段对我来说都是一样的。

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
javascript
1个回答
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一个名字,你可以在定义的同时用()称它,所以你只能制作一个计数器。如果你延迟调用它,你可以根据需要制作尽可能多的它们,并准确控制它们持续多长时间。

© www.soinside.com 2019 - 2024. All rights reserved.