Javascript:混淆函数调用方法的用法

时间:2013-07-22 15:42:45

标签: javascript function call

我实现了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);更好?

或者无所谓

2 个答案:

答案 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));

通过在f​​orEach中绑定{},您将添加意外行为。