我实现了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);
更好?
或者无所谓
答案 0 :(得分:2)
这很重要。 .call()
的第一个参数是在被调用函数中用于this
的值。因此,谈论什么价值“更好”是没有意义的;要传递的正确值是为了使被调用函数正常运行所需的值。
例如,如果你想在Array原型上调用一个函数,那么该函数中this
的值必须是“感觉就像”一个数组(“长度”属性和数字 - 索引属性)。因此:
var sneaky = {
"0": "hello",
"1": "world",
"length": 2
};
alert( Array.prototype.join.call(sneaky, " - ") ); // "hello - world"
这是有效的,因为该函数希望this
引用要连接的数组。
还有许多其他示例,因为有些函数对this
抱有期望。在示例代码中,传递{}
为被调用函数提供对新创建的空对象的this
引用。那会有用吗?我不知道,因为那个功能可以期待什么。除了查看代码(或信任文档)之外,也无法找到答案。如果您只知道它是一些随机任意函数,那么{}
是一个合理的猜测,尽管undefined
可能会更好,以迫使早期失败。
答案 1 :(得分:0)
就个人而言,我会顺便通过这个。通过{},你限制了你的功能的灵活性。您将永远无法以当前编写的方式将另一个对象绑定到此函数。这不起作用:
forEach.call(newContext, array, fn)
这也不会:
forEach(array, fn.bind(newContext));
通过在forEach中绑定{},您将添加意外行为。