调用列表中的所有Javascript函数

时间:2015-05-21 19:06:06

标签: javascript

调用列表中所有函数的最常用的方法是什么?

我能想到的最好的是:

myFunctions.forEach(function(f){f();});

有没有更惯用的方法呢?

编辑:

我现在真的只对ES5感兴趣。也许有一些与Array原型有关的方法?

8 个答案:

答案 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)

嗯,你没有说我们不能使用es6 arrow functions;)

funcs.forEach(x => x());

如果您不能使用es6,则可以始终使用Babel

答案 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]();




会提醒ab

注意:只使用数组。

答案 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)))