在javascript中这个语法`(function(window,undefined)){}(window)`完成了什么

时间:2010-11-08 19:25:40

标签: javascript jquery scripting object

我试图理解如何像jQuery一样“链接”JavaScript事件。我在S.O.找到了一个问题。这与我的目标相似,但我不理解答案中的代码。

Code Source

(function( window, undefined ) { 
...etc...
}(window)

这是什么意思?它在做什么?它让我想起了Jquery的$(document).ready(){}函数,但我不知道为什么这个人将这些代码包装在这个通过windowundefined的匿名函数中。

我的最终目标是弄清楚如何通过将方法链接在一起来执行对象的方法,如jQuery。我知道jQuery已经做到了这一点但我正在研究这个主要是为了成长为开发者。

2 个答案:

答案 0 :(得分:3)

它定义了一个函数(使用function operator而不是function statement)。它周围的括号确保它被视为运算符而不是语句。

然后立即执行它,将window作为参数传递。

基本上,这与:

相同
var myFunction = function( window, undefined ) { 
...etc...
};
myFunction(window);

...但没有插页式变量。

这与jQuery样式函数链无关,其中每个方法都有效地以return this结束(因此在另一个方法的返回值上调用方法与在原始对象上调用它相同)。 / p>

答案 1 :(得分:3)

当使用少于其签名的参数调用函数时,将为尾随参数赋值undefined

所以上面是一个迂回的方法来获取undefined值,即使有些疯子通过说var undefined= 'hello';重新定义它。 (无论如何,这在ECMAScript第五版的'严格模式'中是非法的,但JavaScript编码器有时会做一些奇怪的事情。)

尽管如此,传递window并不是一个很好的理由......如果你不能依赖window,那么获得window的传统方式就是打电话一个函数直接使用this

无论哪种方式,这只是对病态作者JavaScript的防御性编码。在编写自己的代码时,这不是你应该担心的事情(在任何情况下都无法阻止每个方式有人可能搞乱他们的JS环境),而且这与链接无关。