Javascript 为什么这两个参数在jQuery源代码中?

Javascript 为什么这两个参数在jQuery源代码中?,javascript,jquery,Javascript,Jquery,jQuery源被包装在一个闭包中,如下所示: (function(window, undefined) { //awesome jQuery library code in here })(window); 我不明白为什么需要这两个参数 既然window是一个全局变量,为什么需要传入它?传入全局参数并在闭包中使用相同的名称访问它的目的是什么 未定义的参数是什么?为什么没有任何值传递给它?我很确定这已经得到了回答,但是: 传入windowa)允许代码压缩使用名称(即在匿名函数中用一个单字

jQuery源被包装在一个闭包中,如下所示:

(function(window, undefined) {
   //awesome jQuery library code in here
})(window);
我不明白为什么需要这两个参数

既然
window
是一个全局变量,为什么需要传入它?传入全局参数并在闭包中使用相同的名称访问它的目的是什么


未定义的
参数是什么?为什么没有任何值传递给它?

我很确定这已经得到了回答,但是:

  • 传入
    window
    a)允许代码压缩使用名称(即在匿名函数中用一个单字母变量名替换),b)确保变量在定义库时引用窗口对象,以防加载jQuery后有人在全局范围内重新定义
    窗口

  • undefined
    包含为参数(但不传递值)对
    undefined
    做同样的事情,允许变量mung,并避免在重新定义
    undefined
    变量时出现问题(是的,Javascript允许这样做)


我相信在这两种情况下,这都应该加快对变量的引用,因为它使函数范围中的两个全局变量都可用,解释器将在查找全局范围之前搜索全局变量。但老实说,我无法想象这里的性能差异是巨大的-我认为最大的问题是变量名mung,这使得缩小后的代码更加紧凑。

窗口将在此范围内用作局部,我认为这会加快访问速度。如果在全局范围内重新定义
窗口
,当您传入它时,它是否仍然会被重新定义?@PeterOlson-如果以后重新定义它,则不会-这将修复jQuery库加载时的
窗口
引用,因此后续的
窗口
恶作剧将不会有任何效果。我想,如果你在加载库之前重新定义窗口,这个窗口将被破坏,但你应该得到你应得的:)@PeterOlson我想,“代码压缩到munge”将是考虑它的原因,未定义的
变量也可以被重新定义,所以这也可以防止这种情况发生。更新了答案。