()
包裹函数的作用是将匿名函数声明转换为函数表达式,然后可以使用跟随表达式的
()
进行立即调用。
在这种情况下,外部的
()
实际上并不是必要的,因为
var foo =
会将其转换为表达式。此外,由于函数调用没有返回任何内容,
foo
的值将是
undefined
。
它可用于创建新的变量作用域,因为在javascript中只有使用函数才能实现这一点。(JavaScript没有块级作用域。)
因此,
someVar
变量对外部作用域不可见。在某些情况下,以受控的方式使其可访问可能是有意义的。为此,可以传递一个引用
someVar
的函数,并将其从该作用域传出。然后,在函数调用退出后,它的执行上下文仍然保持不变,
someVar
将在您传递的函数提供的任何方式中可用。
这被称为创建一个
闭包(closure)
。
例如,您可以将一个值传递到调用中,并将其分配给
someVar
。然后,您可以通过将函数返回到
foo
变量来使用该函数。如果您返回的函数引用了
someVar
,那么您可以使用该函数来获取其值。
var foo = (function ( str ) {
var someVar = str;
return function() {
alert( someVar );
};
})( 'somevalue' );
foo();
从上面可以看出,现在由foo
引用的函数仍然可以访问someVar
。
假设您将其更改为返回到foo
的函数可以接受一个参数,该参数将更新myVar
的值。
var foo = (function ( str ) {
var someVar = str;
return function( n ) {
if( n ) {
someVar = n;
} else {
alert( someVar );
}
};
})( 'somevalue' );
foo();
foo( 'newvalue' );
foo();
现在你可以看到,foo
函数确实访问了那个变量,因为它能够改变其值,并引用之前设置的新值。