调用列表中所有函数的最常用的方法是什么?
我能想到的最好的是:
myFunctions.forEach(function(f){f();});
有没有更惯用的方法呢?
编辑:
我现在真的只对ES5感兴趣。也许有一些与Array原型有关的方法?
答案 0 :(得分:3)
ES6怎么样?您可以使用arrow function。
这将是:
myFunctions.forEach( f => f());
您今天已经可以使用babel等工具使用它了。有关ES6功能的概述,请查看es6features。
修改强>
您可以使用以下方法扩展Array
对象:
Array.prototype.invokeFunctions = function () {
this.forEach(function (f) {
if (typeof(f) === "function")
f()
});
}
var functions = [
function () { console.log(1);},
function () { console.log(2);}
];
functions.invokeFunctions();
// output
1
2
但是,我不认为这是一个好主意,因为它会污染全局数组原型。更好的想法可能是使用为此目的明确设计的对象。例如:
function FunctionList(functions) {
this.functions = functions;
}
FunctionList.prototype.callAll = function () {
this.functions.forEach(function (f) {
if (typeof(f) === "function")
f()
});
}
var functionList = new FunctionList(functions);
functionList.callAll();
在我看来,这是一个更好的解决方案。每次有函数数组时,都可以将它包装在FunctionList
对象中。但是在这种情况下,您将失去使用Array的所有好处,并且如果要修改/访问函数数组,则必须实现getter和setter方法。
答案 1 :(得分:2)
你可能会变得棘手并使用原型方法,虽然它不是更简洁:
myFunctions.map(Function.prototype.call, Function.prototype.call);
如果你拿到一个引用来调用,那么会更短:
var call = Function.prototype.call;
myFunctions.map(call, call);
或者我们可以坚持使用原型方法:
[].map.apply(fns, [call, call]);
答案 2 :(得分:1)
答案 3 :(得分:1)
这似乎是forEach
的完美用法。除了ES6之外,我唯一能做的就是提取功能以便于阅读:
var callSelf = function(funcToCall) {
funcToCall();
}
因为那时我可以跑:
myFunctions.forEach(callSelf);
答案 4 :(得分:0)
function callEach(scope, funcs) {
funcs.forEach(function (f) { f.call(scope); });
}
callEach(this, myFunctions);
我不知道,你所拥有的似乎很好。
答案 5 :(得分:0)
取决于您是否需要结果或仅需要副作用。这里捕获了返回值:
var results = fns.map(function(fn){return fn();});
答案 6 :(得分:0)
我对数组使用for-in,而不是对象(小心)。
var ts = [function (){alert('a');}, function (){alert('b');}];
for (var tsIndex in ts) ts[tsIndex]();

会提醒a
和b
。
注意:只使用数组。
答案 7 :(得分:0)
这是一些创造性的代码,基本上将确定需要调用哪些函数的职责转移到函数本身。
(time
(let [butter-promise (promise)]
(doseq [butter [yak-butter-international butter-than-nothing baby-got-yak]]
(future (if-let [satisfactory-butter (satisfactory? (mock-api-call butter))]
(deliver butter-promise satisfactory-butter))))
(println "And the winner is:" @butter-promise)))