这个JavaScript/jQuery语法是如何工作的:(function( window, undefined ) { })(window)?

2022-08-30 02:35:52

你有没有看过jQuery 1.4源代码,并注意到它是如何以如下方式封装的:

(function( window, undefined ) {

  //All the JQuery code here 
  ...

})(window);

我读过一篇关于JavaScript命名空间的文章和另一篇名为“一对重要的Parens”的文章,所以我对这里发生的事情有所了解。

但我以前从未见过这种特殊的语法。那个未定义的人在那里做什么?为什么窗口需要通过,然后再次出现在最后?


答案 1

未定义的变量是正常变量,可以使用 简单地更改。因此,jQuery创建了一个本地的“未定义”变量,该变量实际上是未定义的。undefined = "new value";

出于性能原因,窗口变量被设置为本地变量。因为当JavaScript查找变量时,它首先会遍历局部变量,直到找到变量名称。当它没有找到时,JavaScript会通过下一个作用域等,直到它过滤掉全局变量。因此,如果窗口变量是本地变量,JavaScript可以更快地查找它。更多信息:加速你的JavaScript - Nicholas C. Zakas


答案 2

定义

通过声明为参数但从不向其传递值,可确保它始终未定义,因为它只是全局作用域中可以覆盖的变量。这为 节省了几个字符提供了一个安全的替代方法。它还使代码更加小巧友好,例如可以缩短为例如,节省更多字符。undefineda === undefinedtypeof a == 'undefined'undefinedu

作为参数传递会在本地作用域中保留副本,这会影响性能:http://jsperf.com/short-scope。现在,所有访问都必须在范围链上少移动一级。与 ,本地副本再次允许更积极的缩小。windowwindowundefined


附注:

虽然这可能不是jQuery开发人员的意图,但传入允许库更容易集成到服务器端Javascript环境中,例如node.js - 其中没有全局对象。在这种情况下,只需更改一行即可将对象替换为另一行。在jQuery的情况下,可以创建一个模拟对象并传入HTML抓取(像jsdom这样的库可以做到这一点)。windowwindowwindowwindow