Разница между этими двумя синтаксисами закрытия JavaScript?

Возможный дубликат:
Есть ли разница между (function () {…} ()); и (function() {…})();?

Я видел следующий синтаксис, используемый для предотвращения попадания переменных в глобальную область видимости:

(function ($, undefined)
{

})(jQuery);

Совсем недавно я видел код, делающий это так:

(function ($, undefined)
{

} (jQuery));

Я считаю, что 1-й путь имеет наибольшее значение для меня. Я мысленно читаю это как:

Я определил функцию и хочу обернуть ее в выражение (первый набор скобок). Это выражение является функциональным объектом, который я затем хочу вызвать с использованием синтаксиса метода, а параметр, который я передаю этому функциональному объекту, называется jQuery.

Второй синтаксис для меня менее понятен, потому что, похоже, внешние скобки не нужны.

Мои знания JavaScript не достаточно хороши, чтобы чувствовать себя комфортно со вторым синтаксисом. Производят ли они одинаковое поведение? Есть ли разница?

Что бы произошло, если бы ты сделал это?

function ($, undefined)
{

} (jQuery);

3 ответа

Решение

Если function Ключевое слово встречается в начале строки, оно анализируется как объявление оператора функции. Для операторов Funcsion требуется имя функции, поэтому 3-й вариант, который вы предоставляете, запрещен (вы можете проверить это самостоятельно).

Если function Ключевое слово появляется в другом месте, оно анализируется как выражение функции и может быть анонимным. Есть много способов сделать это, но соглашение для шаблона модуля, которое вы показали, заключает конструкцию в круглые скобки. (Некоторые хранители байтов предпочитают использовать унарный оператор, такой как + или ~)

Если вы решите использовать круглые скобки, поместите последнюю внутри (1-я версия) или снаружи (2-я версия) - вопрос личных предпочтений. Я предпочитаю второй, так как скобка оборачивает весь шаблон, а не только функцию.

Причина, по которой вы видите, что это сделано вторым способом, является просто вопросом соглашения. Многие люди запускают свой код через http://www.jslint.com/ (или node-jslint). По умолчанию, инструмент lint будет жаловаться на первую версию немедленной функции.

Чтобы увидеть это в действии, вставьте следующий код в текстовую область на jslint.com и запустите инструмент:

/*jslint devel: true, browser: false, sloppy: false, maxerr: 50, indent: 4 */
(function (a) {
    'use strict';
    alert(a); // Yay!
}("Yay!"));

(function (b) {
    'use strict';
    alert(b); // Yay!
})("Yay!");

Да, это функционально то же самое. Используйте тот, который кажется вам более интуитивным.

Другие вопросы по тегам