javascript - 调用列表中的每个函数

标签 javascript functional-programming

我有一组函数,正在寻找一种简洁的方法来按顺序调用每个函数。

fns = [
    function a() { console.log('a') },
    function b() { console.log('b') },
    function c() { console.log('c') },
]

这个有效:

fns.map(function (f) { f() })

还有这个:

fns.map(function (f) { Function.call.call(f) })

但是这引发了 TypeError:

fns.map(Function.call.call)

为什么后一个示例不起作用?

最佳答案

for (var i = 0, len = fns.length; i < len; i++) {
    fns[i].call();
};

这是工作 fiddle .

使用 Function.prototype.callFunction.prototype.apply 调用函数。使用 callapply,您可以将执行范围和 arguments 传递给函数调用。如果你不需要,你可以简单地做:

for (var i = 0, len = fns.length; i < len; i++) {
        fns[i]();
};

关于您的代码:

Array.prototype.map 是一个以callbackscope 作为参数 的函数。在前两个示例中,您使用匿名函数作为回调,并调用由Array.prototype.map 自动传递给它的参数。扩展一下,您的代码等同于:

function single(element) {
   element();
};
fns.map(single);

所以上面的说法是完全正确的。通过使用 Function.call.call 遵循相同的原则,您正在调用由 map 作为参数传递的函数 f

但在您的第三个示例中,您通过 Function.call.prototype.call 强制执行直接调用,但是在这种情况下,f不再作为参数传递,这意味着您的 Function.call.call 将尝试调用 undefined,因此您会收到 TypeError。当您将 Function.call.call 放入 map() 时,您不是callback 作为参数传递.

调用 将立即进行。 Function.call.callFunction.call.call()Function.call.call(undefined) 完全相同,当您像在第三个示例中那样使用时,将立即对其进行评估。

关于javascript - 调用列表中的每个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923179/

相关文章:

javascript - 在 javascript 中将 onclick 事件设置为 C# URL 操作?

javascript - 如何在运行时(调试)访问 typescript 类公共(public)属性?仅构造函数和函数可访问

javascript - 防止动画期间重叠元素

swift - 在 Swift 中将成员函数分配给成员变量

scala - 什么是 "polymorphism a la carte"以及我如何从中受益?

php - 以编程方式获取单词的定义

javascript - 移除类中定义的 EventListener

java - Java 8 中 Optional 类型的有效使用

javascript - 分配给变量或函数参数的对象方法在调用时失败

functional-programming - ML 函数柯里化(Currying)