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