2012-08-10 54 views
1

我正在阅读John Resig的书籍“JavaScript忍者的秘密”,并在其中解释了如何通过使用此代码扩展对象原型来尝试预测未来语言的功能:此JavaScript代码的后果

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”语句阻止向“调用”函数传递一个可能的未定义值。我不明白的是,将null作为“fn”参数的上下文传递的后果可能是什么。这不会让代码崩溃吗?

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

+1

'callback'不是描述性变量名称。 'fn'实际上是回调函数,''回调函数'this'的值... – pimvdb 2012-08-10 17:39:13

+1

通常名称'scope'用于使用'callback'的地方。 'callback'意味着我的功能。 – 2012-08-10 17:40:30

+0

'this_obj'将会是这个参数的一个更好的名字。 – 2012-08-10 18:06:34

回答

1

没有“真正”的问题与此相关,语境“这”恰好等于null,则。 这是使用.call()或.apply()时常用的方法,如果您没有适当的上下文值。

1

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

callback || null不需要,如果您通过undefined作为范围,它将使用window。尽管可能存在一些模糊的浏览器或不存在的情况,这可以解释Resig为什么这么做。

+1

作用域意味着[完全不同](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope)比你使用它的 – Esailija 2012-08-10 17:49:06

+0

不幸的是,'范围'这个术语变得相当浑浊JavaScript世界。许多人,框架,库等使用术语“范围”来表示“调用函数时'this'的目标” – 2012-08-10 19:35:41

+0

在环顾四周,我认为我最喜欢的名字是'context',它是下划线.js使用。 – 2012-08-10 19:38:52