这很好用:
var test = function(){
var a = 0;
console.log(a);
return function (){
a++;
return a;
};
};
var counter = test();
console.log(counter()); //1
console.log(counter()); //2
console.log(counter()); //3
console.log(counter()); //4
为什么我不能得到相同的结果:
console.log(test());
为什么我需要在这里处理一个有点冗余的代理(var计数器),前提是以下工作正常):
var test = function(k,l){
var c = k + l;
return c;
};
console.log(test(1,2));
这是否与有一个闭包的事实有关,我正在调用一个返回函数的函数,该函数最终会返回一些值?我真的需要在这里定义一个新变量,或者我可以节省时间和代码行并让它直接工作吗?
答案 0 :(得分:1)
这是否与有一个闭包的事实有关,我正在调用一个返回函数的函数,该函数最终返回一些值?
是的。您的函数test()
除了设置变量之外别无其他,只记录0
,然后返回另一个(运算符)函数,该函数关闭test()
的范围。
我真的需要在这里定义一个新变量,或者我可以节省时间和代码行并让它直接工作吗?
是的。您需要通过test()
保持对返回的函数的引用,该函数具有活动的范围链条目。没有任何活动引用(比如将它分配给变量),垃圾收集器会清理它。
答案 1 :(得分:0)
这取决于你想要做什么。
您的第一个示例是一个保存状态的计数器(记住最后一个值)。你可以让多个计数器计算不同的东西。
第二个例子是一个函数,它只是将数字加在一起,但下次没有保持状态或做任何不同的事情。
如果您想拥有一个计数器,但不必先创建它,您可以这样做:
var total = 0;
function count(){
total = total + 1;
return total;
}
现在:
console.log(count()); // 1
console.log(count()); // 2
console.log(count()); // 3
或隐藏函数中的变量:
function counter(){
counter.total = (counter.total||0) + 1;
return counter.total;
}
然后:
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3