我实现了一个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);
更好?
或者没关系
我实现了一个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);
更好?
或者没关系
这很重要。第一个参数 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
可能更好。
就我个人而言,我会通过这个。通过传递 {},您限制了函数的灵活性。您将永远无法按照当前编写的方式将另一个对象绑定到此函数。这不起作用:
forEach.call(newContext, array, fn)
这也不会:
forEach(array, fn.bind(newContext));
通过在您的 forEach 中绑定 {},您正在添加意外行为。