内联函数调用有什么好处?

我看到了这段代码(显然它是在jQuery中,有修改)

(function(window,undefined){ var jQuery=(function(){ var jQuery=something; jQuery.xxx=xxx; //... return jQuery; })(); //... window.jQuery=window.$=jQuery; })(window); 

虽然我理解在内联函数调用中包装代码可以清楚地定义变量范围,但我不明白它的好处

  1. 使用参数传递window而不是直接使用它,
  2. 通过未定义的参数获取undefined的实例,以及
  3. 通过另一个内联函数调用的返回值定义jQuery 。 有人可以解释一下吗?

编辑更清楚地写#3:

我的理解是代码在另一个函数中定义jQuery然后返回它。

 //(function(window,undefined){ var jQuery=(function(){ // Inside this function defines jQuery and return it? var jQuery=function(selector,context){ return new jQuery(selector,context); //simplified }; jQuery.xxx=xxx; //... return jQuery; })(); // This executes the inline function and assign `jQuery` with the return value??? //... })(window); 

这更像是以下内容:

 function define_jQuery(){ // Inside this function defines jQuery and return it? var jQuery=function(selector,context){ return new jQuery(selector,context); //simplified }; jQuery.xxx=xxx; //... return jQuery; } //(function(window,undefined){ var jQuery=define_jQuery(); // This executes the inline function and assign `jQuery` with the return value??? //... })(window); 

这样做不会更简单:

 //(function(window,undefined){ var jQuery=function(selector,context){ return new jQuery(selector,context); //simplified }; jQuery.xxx=xxx; //... //... })(window); 

分别回答这些问题:

  1. 为什么window传入? 因为在JavaScript中解除引用变量是很痛苦的。 传递实例意味着您没有必要。 通常,机制如下所示:

     (function (window, document, $) { }(window, window.document, jQuery)); 

    在这种情况下,不需要去全局范围来取消引用这三个中的任何一个(并且jQuery可以在.noConflict()中引导)。

  2. 这是有效的JavaScript: undefined = 2; 。 我认为这是非常愚蠢的,但这是可能的。 但是如果一个函数接受的函数多于传递的一个参数,那么人们就会确信它是真正undefined而不是它的被黑客攻击的副本。

  3. 从前一个函数返回jQuery允许方法链接: $('#sel').func1().func2() 。 这是可能的,因为func1可能看起来像这样:

     jQuery.fn.func1 = function () { return $(this).each(function () { // do something fabulous }; }; 

return $(this).bla_de_bla()是简写:

  $(this).bla_de_bla(..); return $(this); 

它还假设.bla_de_bla()也返回$(this)

编辑:修改#3注意它最好链接而不是环绕.noConflict()和错误命名$

一个原因是代码缩小。 Minifiers无法缩小全局名称,因为它们不再引用全局对象。 通过传递您正在使用的所有对象,它们变为本地对象。 这样,可以缩小对windowundefined的数千个引用。

window作为参数传递确实可以完全消除所有错误并且浪费空间:它是一个对象,因此通过引用传递。 对闭包内window任何更改都会影响与外部相同的实例。

获取一个undefined参数是任何愚蠢到足以命名实际变量undefined的对策(无论如何你都无法在新的浏览器中做到)

据我所知,第二个内联函数完全没有意义,除非在定义jQuery属性的过程中使用临时变量。

关于“窗口”参数的美丽部分不是解除引用。 如果你在一个实例中传入“window”而在另一个实例中传递window.parent(想想控制父级的子窗口以获得高级function,那么该怎么办!!!)。

  1. 以上解释。

  2. 我还不太确定。

  3. 链接! 例如:$(’#blah’)。hide()。show();

如果隐藏function没有返回对象(#blah),则show无法执行任何操作! 它正在将#blah归还给show函数。

JQuery总是比我更聪明(我经常找到隐藏的线索!)。