设定计数器功能的值

时间:2013-10-18 18:37:00

标签: javascript

以下代码将允许计数器函数每次计数器递增1();叫做。

function One() {  
    var counter = function(initial) {
        var c = initial || 0;
        return function() {
            return c++;
        };
    }(0);
    Too(counter);
}

function Too(counterArg) {
    counter();
}

有什么东西我可以替换counter();这样柜台会减少吗?或者更好的是我有什么办法来设置计数器的价值?像counter = 0或counter = 20?另外,我需要远离全局变量。

2 个答案:

答案 0 :(得分:2)

你可以在javascript中将函数指定为变量,所以现在你可以这样做......

var counter = 0;
var step = 1; // or 20 or whatever
var method = null;

function increment () {
  counter += step;
}

function decrement () {
  counter -= step;
}

method = icrement;
method();

答案 1 :(得分:1)

首先,您的代码中有一个小错字;大概是指你的意思

function Too(counterArg) {
    counterArg();  // this was just `counter` originally; that will be undefined
}

其次,c++是一个奇怪的方法来做一个计数器,因为它返回c然后递增c,所以计数器将从0开始,这可能是不是你想要的。 (我承认,只要我在代码中看到c ++,我就会轻笑一下。:P)

好的,关于主要问题:我是通过向计数器函数添加一个方法来实现的,例如set

function One() {  
    var counter = function createCounter(initial) {
        var c = initial || 0;
        function counter() {
            return ++c;
        }
        counter.set = function(n) {
            c = n;
        };
        return counter;
    }(0);
    Too(counter);
}

function Too(counterArg) {
    counter(); // 1
    counter.set(20);  // `c` is now 20
    counter(); // 21
    counter(); // 22
}

这是有效的,因为counter函数创建了所谓的闭包。这是JavaScript中一个相当普遍的概念,如果你不了解这个概念,你应该看一下关于SO的闭包的很多好问题和答案。基本上,即使您的匿名函数(我重命名为createCounter)返回,变量c仍然存在,可以从createCounter中的任何代码访问。这就是counter函数的工作原理。但c以外的任何代码都无法访问createCounter,因此如果您想对其执行任何操作,则必须将该代码放入createCounter。这就是我添加的counter.set方法。由于它在createCounter范围内,因此可以自由修改c