我正在尝试创建一个保持状态但用foo()调用的函数 有可能吗?
答案 0 :(得分:28)
我相信这就是你想要的:
var foo = (function () {
var state = 0;
return function () {
return state++;
};
})();
或者,关注the Wikipedia example:
var makeAccumulator = function (n) {
return function (x) {
n += x;
return n;
};
};
var acc = makeAccumulator(2);
alert(acc(2)); // 4
alert(acc(3)); // 7
JavaScript是其中一种语言,恕我直言,非常支持作为一等公民的功能。
答案 1 :(得分:4)
由于Javascript函数是第一类对象,因此可以这样做:
var state = 0;
var myFunctor = function() { alert('I functored: ' + state++);};
state
变量将在其本地闭包中用于myFunctor
函数。 (本例中为Global)。这个问题的其他答案有更复杂的例子。
但是,在某些现有对象上没有相当于“实现operator()”的功能。
答案 2 :(得分:2)
您可以将函数视为对象并为其赋予“成员变量”。这里我们在fact
中使用了一个内部函数,但是我们不是仅仅将它声明为局部变量(var loop = ...
),而是使用对象语法将其定义放在函数之外({{ 1}})。这使我们可以“导出”fact.loop = ...
的内部loop
函数,以便函数fact
可以重用它。
doubleFact
同样的想法可以用来维持状态。
var fact = function(n) {
return fact.loop(n, 1);
};
fact.loop = function(n, acc) {
if (n < 1) {
return acc;
} else {
return fact.loop(n-1, acc * n);
}
};
var doubleFact = function(x) {
return fact.loop(x * 2, 1);
};
console.log(fact(5)); // 120
console.log(doubleFact(5)); // 3628800
如果您希望能够实例化多个,每个都有自己的状态,请尝试:
var countCalled = function() {
console.log("I've been called " + (++countCalled.callCount) + " times.");
};
countCalled.callCount = 0;
countCalled(); // I've been called 1 times.
countCalled(); // I've been called 2 times.
countCalled(); // I've been called 3 times.
输出:
var CallCounter = function(name) {
var f = function() {
console.log(name + " has been called " + (++f.callCount) + " times.");
};
f.callCount = 0;
return f;
};
var foo = CallCounter("foo");
var bar = CallCounter("bar");
foo();
foo();
bar();
foo();
bar();
bar();
bar();
console.log(foo.callCount);
console.log(bar.callCount);
答案 3 :(得分:-1)
您可以使用带有附加函数对象属性的闭包返回函数。 初始化后,可以更改这种仿函数(闭包)的参数 这在构建一些可以在以后运行/配置的计算时非常有用。看看下面的例子。这个答案类似于limp_chimp。
index_col=None