首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript/jQuery语法是如何工作的:(function( window,undefined ){ })(window)?

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

Stack Overflow用户
提问于 2010-04-27 02:58:59
回答 5查看 41.2K关注 0票数 156

您是否曾仔细查看过jQuery 1.4源代码,并注意到它是如何以以下方式封装的:

代码语言:javascript
复制
(function( window, undefined ) {

  //All the JQuery code here 
  ...

})(window);

我读过一篇关于JavaScript Namespacing的文章,还有一篇名为"An Important Pair of Parens“的文章,所以我对这里发生的事情有了一些了解。

但我以前从未见过这种特殊的语法。那个undefined在那里做什么?为什么window需要被传递,然后再次出现在末尾?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-27 03:19:25

未定义的变量是一个普通变量,只需使用undefined = "new value";即可更改。因此,jQuery创建了一个真正未定义的本地“未定义”变量。

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

票数 162
EN

Stack Overflow用户

发布于 2011-02-09 21:20:18

未定义的

通过将undefined声明为参数,但从不将值传递给它,可以确保它始终是未定义的,因为它只是全局范围内的一个可以覆盖的变量。这使得a === undefined成为typeof a == 'undefined'的安全替代品,它节省了几个字符。它还使代码更易于使用,例如,可以将undefined缩写为u,从而节省更多字符。

窗口

window作为参数传递会在本地范围内保留一个副本,这会影响性能:http://jsperf.com/short-scope。所有对window的访问现在都必须在作用域链上少走一级。与undefined一样,本地拷贝也允许更积极的缩小。

附注:

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

票数 55
EN

Stack Overflow用户

发布于 2010-04-27 03:36:19

其他人已经解释了undefinedundefined就像一个全局变量,可以重新定义为任何值。这项技术是为了防止如果有人在某个地方写了undefined = 10,所有未定义的检查都会被破坏。无论变量undefined的值是多少,从未传递过的参数都保证为实数undefined

通过窗口的原因可以用下面的例子来说明。

代码语言:javascript
复制
(function() {
   console.log(window);
   ...
   ...
   ...
   var window = 10;
})();

控制台记录了什么?window对象的值,对吗?错!10?不对!它记录undefined。Javascript解释器(或JIT编译器)以这种方式重写它-

代码语言:javascript
复制
(function() {
   var window; //and every other var in this function

   console.log(window);
   ...
   ...
   ...
   window = 10;

})();

但是,如果将window变量作为参数获取,则不会有var,因此也不会有任何意外。

我不知道jQuery是否在这么做,但是如果您出于某种原因在函数中的任何位置重新定义window局部变量,那么从全局作用域借用它是一个好主意。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2716069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档