Javascript 什么';内联函数调用的好处是什么?

Javascript 什么';内联函数调用的好处是什么?,javascript,jquery,Javascript,Jquery,我看到了这段代码(显然是在jQuery中,经过修改) 虽然我理解在内联函数调用中包装代码可以清楚地定义变量范围,但我不理解 使用参数传递窗口,而不是直接使用它 通过未定义的参数获取未定义的实例,以及 通过另一个内联函数调用的返回值定义jQuery。 有人能解释一下吗 编辑更清楚地写#3: 我的理解是,代码在另一个函数中定义jQuery,然后返回它 //(function(window,undefined){ var jQuery=(function(){ // Inside this

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

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

  • 使用参数传递
    窗口
    ,而不是直接使用它
  • 通过未定义的参数获取未定义的
    实例,以及
  • 通过另一个内联函数调用的返回值定义
    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
    作为一个参数进行传递会使所有的问题都变得更糟,这是一种空间浪费:它是一个对象,因此通过引用进行传递。对闭包内部的
    窗口
    所做的任何更改都将影响与外部相同的实例

    获取
    未定义的
    参数对于那些愚蠢到可以命名实际变量
    未定义的
    的人来说是一种对策(在较新的浏览器中无论如何都不能这么做)


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

    分别回答以下问题:

  • 为什么传入
    窗口
    ?因为在JavaScript中取消引用变量是痛苦的。传入一个实例意味着您不必这样做。通常,该机制如下所示:

    (function (window, document, $) {
    }(window, window.document, jQuery));
    
    在这种情况下,无需转到全局范围来取消对这三个变量中任何一个的引用(jQuery可以在
    .noConflict()
    中启动)

  • 这是有效的JavaScript:
    undefined=2。我承认这很愚蠢,但这是可能的。但是,如果在函数中接受的参数多于传递的参数,则可以确信它确实是未定义的,而不是它的黑客副本

  • 从上一个函数返回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()
    和错误命名
    $

    关于“窗口”参数的漂亮部分不是取消引用。如果在一个实例中传入“window”,在另一个实例中传入window.parent(想想子窗口控制父窗口的高级功能,duh!!!)

  • 如上所述

  • 我还不太确定

  • 链接!!!例如:$('#blah').hide().show()

  • 如果hide函数没有返回对象(#blah),show将无法对其执行任何操作!它又回到了表演功能


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

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

    你好,应该会有帮助<代码>:)
    我写了第3条,让它更清楚,你能检查一下吗?里面有一些很好的巫毒故事,一些很聪明的人比我们都聪明。我从来没有像它们那样需要嵌套jQuery定义,而查看您刚才引用的代码确实让我很难眯起眼睛。一些
    jQuery
    s是指向“原始jQuery”(如果您之前定义了它)的指针,一些指向“我们正在构建的jQuery”,一些指向“您所做的选择”。在其他条件相同的情况下,我宁愿他们有更具描述性的名字。真正优雅的是
    jQuery.fn
    jQuery.prototype
    的缩写。为了让它更清楚,我重新编写了#3,你能检查一下吗?
        $(this).bla_de_bla(..);
        return $(this);