Расширенный JavaScript: почему эта функция заключена в круглые скобки? [дубликат]
Возможные Дубликаты:
Что такое (функция() { } )() построить в 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 })();
позволяет немедленно выполнить "некоторый код", как если бы он был просто написан 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 для закрытия, где обсуждаются также анонимные функции.