内联函数调用有什么好处?
我看到了这段代码(显然它是在jQuery中,有修改)
(function(window,undefined){ var jQuery=(function(){ var jQuery=something; jQuery.xxx=xxx; //... return jQuery; })(); //... window.jQuery=window.$=jQuery; })(window);
虽然我理解在内联函数调用中包装代码可以清楚地定义变量范围,但我不明白它的好处
- 使用参数传递
window
而不是直接使用它, - 通过未定义的参数获取
undefined
的实例,以及 - 通过另一个内联函数调用的返回值定义
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);
分别回答这些问题:
-
为什么
window
传入? 因为在JavaScript中解除引用变量是很痛苦的。 传递实例意味着您没有必要。 通常,机制如下所示:(function (window, document, $) { }(window, window.document, jQuery));
在这种情况下,不需要去全局范围来取消引用这三个中的任何一个(并且jQuery可以在
.noConflict()
中引导)。 -
这是有效的JavaScript:
undefined = 2;
。 我认为这是非常愚蠢的,但这是可能的。 但是如果一个函数接受的函数多于传递的一个参数,那么人们就会确信它是真正undefined
而不是它的被黑客攻击的副本。 -
从前一个函数返回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无法缩小全局名称,因为它们不再引用全局对象。 通过传递您正在使用的所有对象,它们变为本地对象。 这样,可以缩小对window
和undefined
的数千个引用。
将window
作为参数传递确实可以完全消除所有错误并且浪费空间:它是一个对象,因此通过引用传递。 对闭包内window
任何更改都会影响与外部相同的实例。
获取一个undefined
参数是任何愚蠢到足以命名实际变量undefined
的对策(无论如何你都无法在新的浏览器中做到)
据我所知,第二个内联函数完全没有意义,除非在定义jQuery
属性的过程中使用临时变量。
关于“窗口”参数的美丽部分不是解除引用。 如果你在一个实例中传入“window”而在另一个实例中传递window.parent(想想控制父级的子窗口以获得高级function,那么该怎么办!!!)。
-
以上解释。
-
我还不太确定。
-
链接! 例如:$(’#blah’)。hide()。show();
如果隐藏function没有返回对象(#blah),则show无法执行任何操作! 它正在将#blah归还给show函数。
JQuery总是比我更聪明(我经常找到隐藏的线索!)。