12

我看到了这段代码(很明显它在 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);
4

4 回答 4

10

分别回答这些问题:

  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()和错误命名$.

于 2012-07-03T04:48:58.370 回答
1

一个原因是代码缩小。缩小器不能缩小全局名称,因为它们不再引用全局对象。通过传入您正在使用的所有对象,它们将成为本地对象。这样,对window, 和的数千个引用undefined就可以缩小。

于 2012-07-03T04:59:26.973 回答
0

作为参数传递window确实很麻烦,而且浪费空间:它是一个对象,因此是通过引用传递的。对闭包内部的任何更改window都会影响与外部相同的实例。

获取undefined参数对于任何愚蠢到命名实际变量的人来说都是一种对策undefined(无论如何您都不能在较新的浏览器中这样做)

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

于 2012-07-03T04:46:37.223 回答
0

关于“窗口”参数的美丽部分不是取消引用。如果您在一个实例中传入“window”而在另一个实例中传入 window.parent 怎么办(想想控制父级以实现高级功能的子窗口,呵呵!!!)。

  1. 上面解释过。

  2. 我还不太确定。

  3. 连锁!!!例如:$('#blah').hide().show();

如果 hide 函数没有返回对象(#blah),show 不能用它做任何事情!它将#blah 返回到 show 函数。

JQuery 总是比我聪明一点(而且我通常会找到隐藏的线索!)。

于 2012-07-03T04:58:25.323 回答