Ответ 1
()
, который обертывает функцию, превращает анонимное объявление функции в выражение функции, которое затем можно немедленно вызвать с помощью ()
, следующего за выражением.
В этом случае внешний ()
действительно не нужен, так как 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
действительно имеет доступ к этой переменной, так как она способна изменить ее значение и ссылаться на новое значение, которое было установлено ранее.