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

2020/11/07 23:42 · javascript ·  · 0评论

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

(function( window, undefined ) {

  //All the JQuery code here 
  ...

})(window);

我读过一篇关于JavaScript名称空间的文章,另一篇是“重要的父母”,所以我知道这里发生了什么。

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

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

出于性能考虑,将window变量设为本地变量。因为当JavaScript查找变量时,它首先会遍历局部变量,直到找到变量名为止。当找不到它时,JavaScript将遍历下一个范围等,直到它对全局变量进行过滤为止。因此,如果将window变量设为本地,JavaScript可以更快地查找它。更多信息:加速您的JavaScript-Nicholas C. Zakas

未定义

通过声明undefined为参数但不传递任何值,可以确保始终是未定义的,因为它只是全局范围内的变量,可以被覆盖。这是a === undefined的安全替代方案typeof a == 'undefined',可节省一些字符。它还可以简化代码,从而简化代码,例如undefined可以简化u为节省更多字符。

窗口

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


边注:

尽管这并不是jQuery开发人员的意图,但传入window可以使该库更轻松地集成到服务器端Javascript环境中,例如node.js-其中没有全局window对象。在这种情况下,只需更改一行即可window用另一行替换对象。在jQuery的情况下,window可以创建一个模拟对象并将其传递给HTML抓取目的(jsdom之类的库可以做到这一点)。

其他人已经解释了undefinedundefined就像可以重新定义为任何值的全局变量。如果有人在undefined = 10某处说了话,此技术可以防止所有未定义的检查都被破坏undefined无论变量 的值如何,保证永不传递的参数是实数undefined

可以通过以下示例说明通过窗口的原因。

(function() {
   console.log(window);
   ...
   ...
   ...
   var window = 10;
})();

控制台记录什么?window对象的值对吗?错误!10点 错误!它记录undefinedJavascript解释器(或JIT编译器)以这种方式重写它-

(function() {
   var window; //and every other var in this function

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

})();

但是,如果将window变量作为参数,则不会有var,因此不会感到意外。

我不知道jQuery是否正在执行此操作,但是如果window出于某种原因要在函数的任何位置重新定义局部变量,则最好从全局范围中借用它。

window就像这样传入,以防万一有人决定在IE中重新定义窗口对象,我也假设undefined,如果以后以某种方式对其进行了重新分配。

window脚本的顶部只是命名参数“ window”,该参数比全局window引用更本地化,并且此闭包中的代码将使用什么。window在年底实际上指定什么传递的第一个参数,在这种情况下,目前的意义window......希望是你还没有搞砸了window在这之前发生。

这可以通过显示在jQuery中使用的最典型的案例,插件想更容易.noConflict()处理,所以对于广大的代码,你仍然可以使用$,即使这意味着什么其他jQuery这个范围之内:

(function($) {
  //inside here, $ == jQuery, it was passed as the first argument
})(jQuery);

经过1000000次迭代测试。这种本地化对性能没有影响。1000000次迭代中甚至没有一个毫秒。这根本没用。

本文地址:http://javascript.askforanswer.com/javascript-jqueryyufaruhegongzuofunctionwindowundefinedwindow.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!