Расширенный JavaScript: почему эта функция заключена в круглые скобки? [дубликат]


Возможные Дубликаты:
Что такое (функция() { } )() построить в JavaScript?

я наткнулся на этот бит кода JavaScript, но я понятия не имею, что из него сделать. Почему я получаю "1", Когда я запускаю этот код? Что это за странное маленькое приложение (1) и почему функция заключена в круглые скобки?

(function(x){
    delete x;
    return x;
})(1);
4 103

4 ответа:

здесь происходит несколько вещей. Во-первых, это сразу же вызывается функция-выражение (IIFE) шаблон:

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

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

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

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

этот синтаксис недопустим:

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

потому что вы должны обернуть функцию в круглые скобки, чтобы сделать ее анализ как выражение. Более подробная информация здесь: http://benalman.com/news/2010/11/immediately-invoked-function-expression/

Итак, напомним быстро по образцу IIFE:

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

позволяет немедленно выполнить "некоторый код", как если бы он был просто написан inline, но также и в своей собственной области, чтобы не влиять на глобальное пространство имен (и, таким образом, потенциально вмешиваться или вмешиваться в другие сценарии).

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

(function(x) {
  // Some code
})(1);

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

во-вторых, у вас есть кишки код самой функции:

delete x;
return x;

оператор delete удаляет свойства из объектов. Он не удаляет переменные. Итак;

var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);

результаты этого регистрируются:

{'baz':5}

а,

var foo = 4;
delete foo;
console.log(foo);

будет регистрировать значение 4, потому что foo-это переменная, а не свойство, и поэтому ее нельзя удалить.

много люди предполагают, что delete может удалять переменные из-за того, как работают автоглобалы. Если вы назначаете переменную без ее предварительного объявления, она фактически не станет переменной, а будет свойством глобального объекта:

bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.

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

window.bar = 4;
delete window.bar;
console.log(window.bar);

и теперь вы можете видеть, как это аналогично объекту foo пример, а не пример переменной foo.

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

это так же как:

function foo(x) {
    delete x;
    return x;
}
foo(1);

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

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

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

здесь ссылка MDN для удаления и ссылка MDN для закрытия, где обсуждаются также анонимные функции.