for (var i = 0, len = fns.length; i < len; i++) {
fns[i].call();
};
这是工作小提琴。
如上所述使用Function.prototype.call
and来调用函数。Function.prototype.apply
使用call
andapply
您可以将执行范围传递arguments
给函数调用。如果您不需要,您可以简单地执行以下操作:
for (var i = 0, len = fns.length; i < len; i++) {
fns[i]();
};
关于您的代码:
Array.prototype.map
callback
是一个接受和的函数scope as parameters
。在前两个示例中,您使用匿名函数作为callback
并调用由 自动传递给它的参数Array.prototype.map
。为了扩展,您的代码相当于:
function single(element) {
element();
};
fns.map(single);
所以上面说的完全正确。通过 using 遵循相同的原则Function.call.call
,您正在调用f
通过 map 作为参数传递的函数。
但是在您的第三个示例中,您强制使用直接call
via Function.call.prototype.call
,但是在这种情况下,f
不再作为参数传递,这意味着您Function.call.call
将尝试调用undefined
,因此您得到了TypeError
. 当您放入 时Function.call.call
,map()
您不会将 acallback
作为参数传递。
将call
立即。与, 或Function.call.call
完全相同,使用时会立即对它进行评估,就像您在第三个示例中所做的那样。Function.call.call()
Function.call.call(undefined)