1

我实现了一个forEach功能:

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

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

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

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

或者没关系

4

2 回答 2

2

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

例如,如果您想在 Array 原型上调用一个函数,那么该this函数内部的值必须是“感觉”像一个数组(“长度”属性和数字索引属性)。因此:

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

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

这是有效的,因为该函数期望this引用要连接的数组。

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

于 2013-07-22T15:43:49.020 回答
0

就我个人而言,我会通过这个。通过传递 {},您限制了函数的灵活性。您将永远无法按照当前编写的方式将另一个对象绑定到此函数。这不起作用:

forEach.call(newContext, array, fn)

这也不会:

forEach(array, fn.bind(newContext));

通过在您的 forEach 中绑定 {},您正在添加意外行为。

于 2013-07-22T15:49:30.900 回答