我有一个嵌套函数,可在父函数中重写一个变量。我尝试了两种不同的调用语法。两者都合法,但第二个却给出了不良结果。
我知道范围是在定义期间确定的,但这似乎无济于事,因为两个代码片段在我看来都是相同的。
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
答案 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
命名,而是在定义的同时使用()
来命名,因此只有可以曾经做过一个柜台。如果您延迟调用它,则可以根据需要创建任意数量的对象,并精确控制它们的持续时间。