JavaScript объем и закрытие - PullRequest
13 голосов
/ 10 марта 2009

Я пытаюсь обернуть голову вокруг замыканий (где-то там есть шутка), и я наткнулся на это:

(function () { /* do cool stuff */ })();

Как это работает? Какова цель помещения функции в паренсе? Почему пустые парены потом?

Ответы [ 7 ]

30 голосов
/ 10 марта 2009

Дело в том, что любые переменные, объявленные в классном материале, не будут созданы в глобальном пространстве имен. Любая функция в javascript создаст такую ​​область видимости. Предположим, у вас есть какой-то JavaScript, который вы хотите запустить. Если вы сделаете это:

var b = 1; 
// stuff using b

И какой-то другой код использует b, он получит ваше оставшееся значение. (Или, что еще хуже, если какой-то другой кодовый набор b до запуска вашего кода будет запущен, а затем попытается получить его старое значение, вы тем временем измените его.)

С другой стороны, если у вас есть этот код, который объявляет и затем вызывает функцию:

function a() { 
     var b = 1;
}

a();

И какой-то другой код позже использует b, он не увидит ваши значения, так как b локально для функции. Проблема с этим, конечно, в том, что вы все еще делаете глобальное имя - в данном случае «а». Итак, нам нужна функция без имени - вот почему вы получаете код, который вы описали. Он объявляет функцию без имени, а затем вызывает ее.

К сожалению, вы не можете просто сказать:

function() { ... }()

потому что это будет проанализировано как объявление функции оператор , а затем синтаксическая ошибка. Заворачивая объявление функции в круглые скобки, вы получаете функцию выражение , которую затем можно вызвать. Вы называете это как любое другое выражение функции (например, выше), используя второй набор символов. Например, если функция принимает аргументы, вы передаете их туда:

(function(a) { ... })(1)
6 голосов
/ 10 марта 2009

Это создает функцию, вызывает ее и удаляет ее.

Возможно, будет понятнее, если вы посмотрите на это так:

var throwaway = function(){
    // do cool stuff
};
throwaway();

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

2 голосов
/ 18 марта 2011

Я только недавно наткнулся на этот пост. Этот тип определения и вызова функции называется самовозвратными функциями .

(function(){  //code })();

Код внутри функции будет выполнен сразу же после ее определения.

1 голос
/ 14 августа 2015

Один из подходов замыканий - передать переменные в функцию:

(function($, var_1, var_2) {
    // use JQuery, var_1 and var_2 as local variables
})($, var_1, var_2);
1 голос
/ 10 марта 2009

Парень вокруг функции проясняет, что функция является выражением. Парены после - это вызов функции.

Обратите внимание, что функция не имеет имени.

1 голос
/ 10 марта 2009

Эта конструкция означает объявление анонимной функции и немедленное ее выполнение. Причина, по которой вы помещаете свой код в тело функции, состоит в том, что переменные, которые вы определяете внутри него, остаются локальными для функции, а не глобальными переменными. Однако они все равно будут видны замыканиям, определенным внутри этой функции.

0 голосов
/ 10 марта 2009

Помещение объявления функции внутри parens создает выражение, которое оценивает анонимную функцию внутри. Следовательно, первая скобка соответствует функции.

"Пустые парены" в конце вызывают определенную функцию, поэтому "// делать классные вещи" выполняется немедленно.

Это способ выполнения кода «на лету», в то же время исключая переменные из глобальной области видимости.

То, что показано здесь, однако, не имеет ничего общего с замыканиями - по крайней мере, не напрямую. Замыкания - это поддержание лексической области видимости после того, как родительская функция уже вышла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...