我有一组函数,正在寻找一种简洁的方法来按顺序调用每个函数。
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.call
和 Function.prototype.apply
调用函数。使用 call
和 apply
,您可以将执行范围和 arguments
传递给函数调用。如果你不需要,你可以简单地做:
for (var i = 0, len = fns.length; i < len; i++) {
fns[i]();
};
关于您的代码:
Array.prototype.map
是一个以callback
和scope 作为参数
的函数。在前两个示例中,您使用匿名函数作为回调
,并调用由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.call
与 Function.call.call()
或 Function.call.call(undefined)
完全相同,当您像在第三个示例中那样使用时,将立即对其进行评估。
关于javascript - 调用列表中的每个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923179/