Ответ 1
Если статья утверждает, что Вариант 3 является "более тщательным", он неверен. Нет никакого смысла в середине этой цепочки назначения вообще.
Кто-нибудь сможет пролить свет на различия между различными вариантами и, в частности, объяснить, почему вариант 3 описывается как более тщательный?
Во-первых, оговорка: здесь, в 2018 году, вы, вероятно, не захотите использовать какие-либо из них. Вместо этого используйте соответствующие модули либо с помощью одного из синтаксисов определения модуля (AMD, CommonJS, RequireJS) с соответствующим инструментом, либо через ES2015+ модули с import
и export
(и, вероятно, подходящим инструментом, таким как Babel и, возможно, Webpack или Браузеруйте, хотя текущие версии модулей поддержки Chrome, Safari и Edge изначально, а Firefox также в настоящее время находится за флагом).
Почему
var x = x = x || {}
var x = x = x || {}
более тщательный, чемvar x = x || {}
var x = x || {}
?
Это не так.
Вариант 2 в порядке, но, кажется, не хватает
var myApplication
заранее илиif(!window.myApplication)
иначе еслиmyApplication
не входит в глобальную область, условиеif(!myApplication)
вызовет ошибку, не так ли?
Да. (Предполагая, что производство происходит в глобальном масштабе.Если это не в глобальном масштабе и там в myApplication
в области myApplication
любой точке текущей цепочки областей, она не будет бросать, потому что myApplication
не будет неразрешенным символом.)
Вариант 3 - тот, с которым у меня возникают проблемы: я понимаю, что
myApplication = myApplication
выполняетсяmyApplication = myApplication
, аmyApplication
в глобальной области (из-заvar
в начале). Моя проблема в том, что я не могу придумать случай, когда этот вариант делает что-то большее, чем вариант 1.
Нет, если у вас есть
var myApplication = myApplication = myApplication || {}
это порядок, в котором происходят события:
-
var myApplication
создает глобальный, если он еще не существует, оставляет его нетронутым, если он -
myApplication || {}
myApplication || {}
оценивается и принимает либо значение вmyApplication
(если оно правдиво), либо{}
(если нет); позвольте этомуvalue1
-
myApplication = value1
(тот, что посередине), и результат равенvalue1
-
myApplication = value1
(один слева) выполняется снова без уважительной причины
Вариант 4 в моих глазах был бы лучше написанным
window.myApplication || (myApplication = {})
window.myApplication || (myApplication = {})
чтобы избежать ошибки, еслиmyApplication
не находится в глобальной области.
В самом деле.
Вариант 5 исключает значения false-y, отличные от
undefined
но это хорошая идея? ЕслиmyApplication
- пустая строка, остальная часть кода, скорее всего, потерпит неудачу, не так ли?
Да.