您是否曾经看过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-scope。window
现在,对的所有访问都必须比作用域链少一层。与一样undefined
,本地副本再次允许更积极的缩小。
边注:
尽管这并不是jQuery开发人员的意图,但传入window
可以使该库更轻松地集成到服务器端Javascript环境中,例如node.js-其中没有全局window
对象。在这种情况下,只需更改一行即可window
用另一行替换对象。在jQuery的情况下,window
可以创建一个模拟对象并将其传递给HTML抓取目的(jsdom之类的库可以做到这一点)。
其他人已经解释了undefined
。undefined
就像可以重新定义为任何值的全局变量。如果有人在undefined = 10
某处说了话,此技术可以防止所有未定义的检查都被破坏。undefined
无论变量 的值如何,保证永不传递的参数是实数undefined
。
可以通过以下示例说明通过窗口的原因。
(function() {
console.log(window);
...
...
...
var window = 10;
})();
控制台记录什么?window
对象的值对吗?错误!10点 错误!它记录undefined
。Javascript解释器(或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次迭代中甚至没有一个毫秒。这根本没用。
文章标签:javascript , jquery , syntax
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!