我正在阅读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);
}
};
}
现在,我知道“callback || null”语句阻止将可能的未定义值传递给“call”函数。我不明白的是,将null作为“fn”参数的上下文传递可能会产生什么后果。这不会导致代码崩溃吗?
感谢您提供的任何解释和/或启发。
答案 0 :(得分:1)
这没有“真正的”问题,上下文“this”只等于null。 这是使用.call()或.apply()的常用方法,如果您没有适合上下文的值。
答案 1 :(得分:1)
Function.call
的第一个参数是运行函数的范围。如果该参数为falsey(null
是一种形式的假),那么它将在全局范围内运行该函数。在浏览器中,这意味着该功能将在this
设置为window
的情况下运行。
如果您将callback || null
作为范围传递,则不需要undefined
,它将使用window
。虽然可能存在一些不起眼的浏览器或情况,但这并不能解释为什么Resig会这样做。
答案 2 :(得分:0)
不,它不会导致崩溃。根据{{3}}:
[...]如果该方法是非严格模式代码中的函数,则
null
和undefined
将替换为全局对象,并且原始值将被加框。
(对于网页,“全局对象”为window
。)