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

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

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

var foo = (function () { var someVar; function someFunc() { return true; } })(); 

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

包装函数的()将匿名函数声明转换为函数表达式,然后可以使用表达式后面的()立即调用该函数表达式。

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

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

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

这称为创建closure

假设您将一个值传递给调用,并将其分配给someVar 。 然后,您可以将调用中的函数returnfoo变量。 如果你返回的函数引用someVar ,那么你可以使用该函数来获取它的值。

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

如您所见, 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' 

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

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

 (function(param) { // do stuff })(param); 

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

 (function($) { $('.something').addClass('.other'); })(jQuery); 

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