Это является обычной практикой при использовании JQuery:
(function ($) {
var div = $('#my-div');
// Etc
}(jQuery));
Обертывания скрипта в затворе обеспечивает, что некоторые переменные будут иметь значения, которые вы ожидаете от них.
Например, jQuery использует $
для выполнения почти всего. Большинство людей любят использовать $('do something')
, а не jQuery('do something')
.
Но скажите, что у вас есть другая библиотека на странице, которая также использует глобальную переменную $
.
Обернув свой код в закрытии, вы «зарезервируете» $
как jQuery и только jQuery. (Когда вы передаете в jQuery
в качестве аргумента закрытия, $
может только означает «Jquery», в рамках этой функции.)
Кроме того, в вашем примере, вы резервируете переменную NAMESPACE
. Даже если бы существовала другая переменная, называемая NAMESPACE
, вызывающая ракетку где-то еще на странице, передавая переменную в конце вашего закрытия, вам гарантируется, что NAMESPACE
будет объектом, который вы ожидаете от нее (по крайней мере, в пределах закрытие).
Скажите, что у вас была глобальная переменная с именем AbominableSnowman
, но вы хотели использовать AS
в качестве ярлыка. При этом:
var AS = "Apple Soup";
(function (AS) {
AS.tellMeAboutSnowmen();
alert(AS.snowballs);
}(AbominableSnowman));
Ваш код по-прежнему будет функционировать так, как вы планировали. (Доказательство http://jsfiddle.net/RUzZH/1/)
Что касается «листать его вокруг,» кажется, что оригинальный программист хотел сократить NAMESPACE.nav
вплоть до nav
. Вероятно, это был лучший способ сделать это.
Альтернативой (не рекомендуется):
// It's best to limit your assignments to 1-per-line
// This kind of code isn't fun to debug, or even read
var nav = NAMESPACE.nav = {};
Это не похоже, что-то стоит разъедающий над. Однако, поскольку этот скрипт взаимодействует с NAMESPACE.nav
довольно часто, он будет немного, немного быстрее, чтобы напрямую ссылаться на свойство .nav
с переменной nav
. (Это действительно микро-оптимизация, но в этом случае удобно оправдано по другой причине [ради ясности].)
Это как расширяющийся, так и внешний объект (переданный) и создающий локальную переменную. – bfavaretto
Вместо этого вы можете сделать «var nav = NAMESPACE.nav = {};». Или даже опустить локальные переменные, но это похоже на удобное обращение к пространству имен позже в коде. –
@bfavaretto спасибо за комментарий - я вижу, что вы имеете в виду (прошел). – timmackay