Подтвердить что ты не робот

Область и закрытие JavaScript

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

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

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

4b9b3361

Ответ 1

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

var b = 1; 
// stuff using b

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

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

function a() { 
     var b = 1;
}

a();

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

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

function() { ... }()

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

(function(a) { ... })(1)

Ответ 2

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

Возможно, было бы лучше, если вы посмотрите на это следующим образом:

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

(function($, var_1, var_2) {
    // use JQuery, var_1 and var_2 as local variables
})($, var_1, var_2);

Ответ 6

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

Ответ 7

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

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

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

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