2013-07-22 42 views
1

我实现了forEach功能:的Javascript:混淆关于函数的调用方法的使用

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);比较好?

或者不要紧

回答

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可能更好,强制早期失败。

0

就我个人而言,我会去传递这个。通过传递{}您限制了您的函数的灵活性。您将永远无法将其他对象与当前写入的方式绑定到该函数。这是行不通的:

forEach.call(newContext, array, fn) 

都不会对这样的:

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

通过绑定{}您的forEach内要添加意外的行为。