for (var i = 0, len = fns.length; i < len; i++) {
fns[i].call();
};
这是工作小提琴。
如上所述使用Function.prototype.calland来调用函数。Function.prototype.apply使用callandapply您可以将执行范围传递arguments给函数调用。如果您不需要,您可以简单地执行以下操作:
for (var i = 0, len = fns.length; i < len; i++) {
fns[i]();
};
关于您的代码:
Array.prototype.mapcallback是一个接受和的函数scope as parameters。在前两个示例中,您使用匿名函数作为callback并调用由 自动传递给它的参数Array.prototype.map。为了扩展,您的代码相当于:
function single(element) {
element();
};
fns.map(single);
所以上面说的完全正确。通过 using 遵循相同的原则Function.call.call,您正在调用f通过 map 作为参数传递的函数。
但是在您的第三个示例中,您强制使用直接callvia 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)