1

我正在阅读 John Resig 的《JavaScript Ninja 的秘密》一书,他在其中解释了如何通过使用以下代码扩展对象的原型来尝试预测该语言的未来功能:

if(!Array.prototype.forEach){
   Array.prototype.forEach = function(fn, callback){
      for(var i = 0; i < this.length; i++){
         fn.call(callback || null, this[i], i, this);
      }
   };
}

现在,我了解到“回调 || null”语句会阻止将可能的未定义值传递给“调用”函数。我不明白将 null 作为“fn”参数的上下文传递的后果是什么。这不会使代码崩溃吗?

感谢您提供的任何解释和/或启发。

4

3 回答 3

1

这没有“真正的”问题,上下文“this”就等于null。如果您没有合适的上下文值,这是使用 .call() 或 .apply() 时的常用方法。

于 2012-08-10T17:39:12.443 回答
1

Function.call的第一个参数是运行函数的范围。如果该参数是 falsey(null是 falsey 的一种形式),那么它将在全局范围内运行该函数。在浏览器中,这意味着该函数将在this设置为的情况下运行window

callback || null不需要,如果您作为范围传入,undefined它将使用window. 尽管可能存在一些晦涩难懂的浏览器或没有的情况,但这可以解释 Resig 这样做的原因。

于 2012-08-10T17:39:15.963 回答
0

不,它不会导致崩溃。根据https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call

[…] 如果方法是非严格模式代码中的函数,nullundefined被替换为全局对象,原始值将被装箱。

(在网页的情况下,“全局对象”是window。)

于 2012-08-10T17:39:07.787 回答