您是否曾仔细查看过jQuery 1.4源代码,并注意到它是如何以以下方式封装的:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
我读过一篇关于JavaScript Namespacing的文章,还有一篇名为"An Important Pair of Parens“的文章,所以我对这里发生的事情有了一些了解。
但我以前从未见过这种特殊的语法。那个undefined
在那里做什么?为什么window
需要被传递,然后再次出现在末尾?
发布于 2010-04-27 03:19:25
未定义的变量是一个普通变量,只需使用undefined = "new value";
即可更改。因此,jQuery创建了一个真正未定义的本地“未定义”变量。
出于性能原因,窗口变量被设为局部变量。因为当JavaScript查找变量时,它首先遍历本地变量,直到找到变量名。当没有找到它时,JavaScript会检查下一个作用域,直到它过滤掉全局变量。因此,如果将窗口变量设为局部变量,JavaScript可以更快地查找它。更多信息:Speed Up Your JavaScript - Nicholas C. Zakas
发布于 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这样的库可以做到这一点)。
发布于 2010-04-27 03:36:19
其他人已经解释了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
局部变量,那么从全局作用域借用它是一个好主意。
https://stackoverflow.com/questions/2716069
复制相似问题