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

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

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

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

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
})();

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

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

(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 ссылка для закрытия, в котором обсуждаются также анонимные функции.