括号中的代码块在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
。 然后,您可以将调用中的函数return
给foo
变量。 如果你返回的函数引用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
对象传入并覆盖该函数范围内的$
变量来消除冲突的可能性,因此可以使用该快捷方式。