Что означает код в скобках в JavaScript/jQuery?

Возможный дубликат:
Что делает (function ($) {}) (jQuery); значит?

Я видел много jQuery-кода со следующим синтаксисом, но я не совсем понимаю, что это значит. Он отображается в этом ответе и этот ответ на вопрос о организации кода. Оба говорят об именах, поэтому я предполагаю, что он выполняет.

var foo = (function () {
    var someVar;

    function someFunc() {
        return true;
    }
})();

Это для пространства имен и как это работает? Иногда в конечном наборе круглых скобок есть имя (пространство имен?), Иногда нет. В чем разница между двумя?

Ответы

Ответ 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 действительно имеет доступ к этой переменной, так как она способна изменить ее значение и ссылаться на новое значение, которое было установлено ранее.

Ответ 2

Круглые скобки обертывают анонимную функцию, чтобы сделать ее переменной, которую можно вызвать непосредственно, добавив после нее параметры.

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

Бит в конце не является пространством имен, а просто параметром. Вероятно, вы видели это для jQuery как:

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

То, что это делает, - передать объект jQuery в функцию, сделав переменную $ объектом jQuery в рамках анонимной функции. Людям нравится использовать стенографию $, но это может привести к конфликтам с другими библиотеками. Этот метод устраняет возможность конфликта, передавая полный объект jQuery и переписывая переменную $ в пределах этой функции, поэтому можно использовать ярлык.