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

Возможный дубликат:
Как работают блокировки JavaScript?

Я играл с Google Closure Compiler, помещая случайный код, чтобы посмотреть, что он будет делать.

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

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​

Если окажется, что "Hello World" - это аргумент, переданный как msg для анонимной функции, предшествующей ему. Я смотрел на него на мгновение и думал, что видел что-то подобное в плагинах jQuery, которые выглядят примерно так:

(function( $ ) {
  ...
})(jQuery); 

Что теперь имеет для меня больше смысла, в контексте конфликтов с $. Но какова основная причина или цель передачи аргументов в анонимную функцию вроде этого? Почему бы вам просто не определить аргументы в качестве переменных внутри функции? Есть ли преимущество в производительности или гибкости при написании таких функций?

Существует одно существенное различие, связанное также с областью. Следующий код:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​

в некоторых случаях является более чистым с точки зрения загрязнения пространства имен, чем это:

var msg = "Hello World!";
console.log(msg);

потому что второй код оставляет переменную после того, как она больше не нужна, но может помешать другим частям кода.

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

9
ответ дан 03 окт. '12 в 0:27
источник

В принципе, всегда полезно сохранить код, завернутый в это: (function(){/*code*/}());, чтобы ваши вары не столкнулись с другими народами.

Я думаю, что главным компилятором закрытия является сохранение 5 символов: var  и =.

0
ответ дан 03 окт. '12 в 0:34
источник

Это немного зависит от контекста. Существуют некоторые условия, когда компилятор не будет пытаться встроить какую-либо функцию вообще (если функция определения области содержит, например, "eval" ). Если это глобальная область действия и вы работаете в режиме ADVANCED, это просто, что возможность вставки появилась после того, как компилятор перестает пытаться встроить функции (или есть ошибка в коде наложения, и это упустило эту возможность). Если вы запустите свой образец вывода через компилятор в режиме ADVANCED, вы получите следующее:

console.log("Hello World!");
0
ответ дан 03 окт. '12 в 4:02
источник