括号中的代码块在JavaScript/jQuery中意味着什么?

kei*_*ant 14 javascript syntax jquery closures

可能重复:
什么(function($){})(jQuery); 意思?

我已经看过很多带有以下语法的jQuery代码,但我真的不明白它的含义.它出现在这个答案和关于代码组织的问题的答案中.两者都谈论命名空间,所以我猜这就是它的成就.

var foo = (function () {
    var someVar;

    function someFunc() {
        return true;
    }
})();
Run Code Online (Sandbox Code Playgroud)

这是用于命名空间,它是如何工作的?有时在最后一组括号中有一个名称(命名空间?),有时不是.两者有什么区别?

use*_*716 15

()该包裹功能会将匿名函数声明为可随后与被立即调用的函数表达式()下面的表达式.

在这种情况下,外部()确实不是必需的,因为它var foo =会把它变成表达式.此外,值foo将是undefined因为函数调用不返回任何内容.

它可以用于创建一个新的变量范围,因为函数是在javascript中实现它的唯一方法.(Javascript没有块范围.)

因此someVar外部范围无法访问该变量.有时可能希望以受控方式使其可访问.为此,您可以将函数传递给引用的作用域someVar.然后在函数调用退出后,其执行上下文将保持不变,并且someVar将以您传递的函数提供的任何方式提供.

这称为创建closure.

假设您将一个值传递给调用,并将其分配给someVar.然后,您可以return通过调用foo变量来调用函数.如果该函数返回引用someVar,则可以使用该函数获取其值.

var foo = (function ( str ) {
    var someVar = str;
/*
    function someFunc() {
        return true;
    }
*/
    return function() {
        alert( someVar );
    };
})( 'somevalue' );

foo(); // alerts 'somevalue'
Run Code Online (Sandbox Code Playgroud)

如您所见,现在引用的函数foo仍然可以访问someVar.

假设您更改了它,以便返回的函数foo可以接受一个参数,该参数将更新值myVar.

var foo = (function ( str ) {
    var someVar = str;
/*
    function someFunc() {
        return true;
    }
*/
    return function( n ) {
        if( n ) {
            someVar = n;
        } else {
            alert( someVar );
        }
    };
})( 'somevalue' );

foo(); // alerts 'somevalue'

foo( 'newvalue' ); // give it a new value

foo(); // alerts 'newvalue'
Run Code Online (Sandbox Code Playgroud)

现在您可以看到,函数foo确实可以访问该变量,因为它可以更改其值,并引用先前设置的新值.


Orb*_*ing 7

括号包围匿名函数,以使其成为可以通过在其后添加参数直接调用的变量.

(function(param) {
    // do stuff
})(param);
Run Code Online (Sandbox Code Playgroud)

最后的位不是命名空间,只是一个参数.你可能已经看到这用于jQuery:

(function($) {
    $('.something').addClass('.other');
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

这样做是将jQuery对象传递给函数,使$变量成为匿名函数范围内的jQuery对象.人们喜欢使用速记$,但它可能导致与其他图书馆的冲突.此技术通过将完全限定的jQuery对象传入和覆盖该$函数范围内的变量来消除冲突的可能性,因此可以使用该快捷方式.