0

以下代码将允许计数器函数每次 counter() 加一;叫做。

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?我也需要远离全局变量。

4

2 回答 2

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();
于 2013-10-18T18:41:27.877 回答
1

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

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

其次,c++做一个计数器有点奇怪,因为它返回c然后递增c,所以计数器将从 0 开始,这可能不是你想要的。(我承认,每当我在代码中看到 c++ 时,我都会咯咯地笑。:P)

好的,关于主要问题:我会通过向名为 eg 的计数器函数添加一个方法来做到这一点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不能被. 这就是我添加的方法的作用。既然是 inside ,就可以自由修改。createCountercreateCountercounter.setcreateCounterc

于 2013-10-18T18:45:15.620 回答