我实现了forEach函数:

function forEach(arr, fn) {
    for (var i = 0; i < arr.length; i++) {
        fn.call({}, arr[i], i);
    }
}


我困惑的是关于fn.call({}, arr[i], i);

第一个参数是传递空,就像上面的{}更好

或在this中传递fn.call(this, arr[i], i);更好?

还是没关系

最佳答案

这很重要。 .call()的第一个参数是被调用函数中用于this的值。因此,谈论什么价值是“更好”是没有意义的。传递正确的值是您所需要的值,以便调用的函数正常运行。

例如,如果要在Array原型上调用一个函数,则该函数内的this值必须类似于数组(“ length”属性和数字索引属性)。从而:

var sneaky = {
  "0": "hello",
  "1": "world",
  "length": 2
};

alert( Array.prototype.join.call(sneaky, " - ") ); // "hello - world"


之所以可行,是因为该函数希望this引用要连接的数组。

除了对this有期望的功能之外,还有其他许多示例。在您的示例代码中,传递{}会给被调用函数一个对该新创建的空对象的this引用。那行得通吗?我不知道,因为该功能可能会发生任何事情。除了查看代码(或信任文档)之外,也无法找到答案。如果您只知道它是一些随机的任意函数,那么{}是合理的猜测,尽管undefined可能会更好,以强制早期失败。

关于javascript - Javascript:对函数调用方法的用法感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17791836/

10-14 15:23
查看更多