Вопрос
Часто я вижу глобальный объект, определенный в коде JavaScript, чтобы действовать как пространство имен.
var MyNS = {a: function() {}, ... };
Но иногда я вижу, как люди уходят из ключевого слова "var", как
MyNS = {a: function() {}, ...};
Я верю в веб-браузеры, если вы не определяете переменную с var, она помещается в окно объекта, который действует как глобальное пространство имен. Так как он экономит несколько байтов текста, не используя «var», есть ли причина использовать ключевое слово Для этой конкретной цели ?
Решение
Так как он экономит несколько байтов текста, не используя «var», есть ли причина использовать ключевое слово для этой конкретной цели?
Я не рекомендую вам избежать var
Ключевое слово, даже если вы находитесь в глобальном коде.
Два способа кажутся похожими, но на самом деле они не одинаковы, первый - это Переменная декларация, то Переменная объекта В Global Code является сам глобальный объект, поэтому глобальные переменные доступны в качестве свойств глобального объекта (window.MyNS
).
Второй Недослуженное назначение, он создает свойство на глобальном объекте, если идентификатор не найден в цепочке области.
Реальная причина избежать того, что в новом стандарте языка, Ecmascript 5-е издание, под Строгий режим, присвоение к незабываемому идентификатору бросит ReferenceError
ломаю свой код.
Существует также еще одна тонкая разница между вашими двумя примерами, экскурирование переменной создает свойство на глобальном объекте, который не удалена:
var myVar = '';
delete window.myVar; // false
typeof window.myVar; // 'string'
В то время как неразделенное назначение не:
myProp = '';
delete window.myProp; // true
typeof window.myProp; // 'undefined'
Рекомендуемая статья:
Другие советы
Использование var
Определяет локальную переменную в текущем объеме. Если вы находитесь в глобальном масштабе, они эффективно эквивалентны. Использование var
Подробнее для понимания и ремонтопригодности, так как намерение абсолютно ясна. Это менее ясно, не инициализация var
.
В любом местном объеме, если MyNS
Инициализируется где-то подразделение цепи охвата, вы перезаписываете эту локальную переменную, а не определяющую глобальную переменную.
Я думаю, что приятно использовать ключевое слово, потому что он получает вас в привычке, и помогает предотвратить неприятные ошибки, когда вы забыли его внутри функциональных органов. Также приятно в случае, если какой-то глобальный код найдет себя мигрироваться в функцию.
Но нет, это не строго необходимо.
редактировать - @eyeliDeless имеет действительно хороший момент, хотя если вы печатаете код на глобальном уровне, уже это не проблема.
Справедливой пуленепробиваемый узор, который я видел, - это инициализировать глобальные пространства имен с чем-то вроде этого:
(function(window, undefined) {
var foo = { stuff: "in my namespace", ... };
window.foo = foo;
})(this);
На глобальном уровне, this
Будет окно объектом (если вы находитесь в браузере; если нет, то это все, что глобальный объект в этом контексте).
Дуглас Крукфорд по этому вопросу:http://www.yuiblog.com/blog/2008/04/16/global-domination-part-two/
Он посещается на использовании комментария с инициализацией, но без var
. Отказ Его анализ компромиссов стоит читать, даже если вы не согласны.