The ()
包装函数将匿名函数声明转换为函数表达式,然后可以立即使用()
表达式后面的内容。
在这种情况下,外()
确实没有必要,因为var foo =
会把它变成一个表达式。另外,值foo
将undefined
因为函数调用不返回任何内容。
它可用于创建新的变量范围,因为函数是在 javascript 中完成此操作的唯一方法。 (Javascript 没有块作用域。)
So the 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
确实访问该变量,因为它能够更改其值,并引用它之前设置的新值。