正确调用带有返回的闭包

时间:2015-02-16 16:32:02

标签: javascript closures return-value

这很好用:

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));

这是否与有一个闭包的事实有关,我正在调用一个返回函数的函数,该函数最终会返回一些值?我真的需要在这里定义一个新变量,或者我可以节省时间和代码行并让它直接工作吗?

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