这个JavaScript代码的后果

Consequences of this javascript code

本文关键字:后果 代码 JavaScript 这个      更新时间:2023-09-26

我正在阅读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"参数的上下文传递的后果是什么。这不会使代码崩溃吗?

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

这没有"真正的"问题,上下文"this"刚好等于null。这是使用 .call() 或 .apply() 时的一种常见方法,如果您没有上下文的适当值。

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

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

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

[...]如果该方法是非严格模式代码中的函数,则nullundefined将被全局对象替换,并且基元值将被装箱。

(对于网页,"全局对象"是window