Почему var x = x = x || {} более тщательный, чем var x = x || {}?

В моем стремлении написать чистый Javascript-код в качестве новичка, я недавно читал эту статью об именах в JavaScript, когда я наткнулся на этот параграф:

Код в самой верхней части следующего примера демонстрирует различные способы, которыми вы можете проверить, чтобы проверить, существует ли переменная (пространство имен объектов) уже до ее определения. Обычно вы увидите разработчиков, использующих вариант 1, однако варианты 3 и 5 можно считать более тщательными, а вариант 4 считается хорошей передовой практикой.

// This doesn't check for existence of 'myApplication' in
// the global namespace. Bad practice as you can easily
// clobber an existing variable/namespace with the same name
var myApplication = {};

/*
The following options *do* check for variable/namespace existence.
If already defined, we use that instance, otherwise we assign a new
object literal to myApplication.

Option 1: var myApplication = myApplication || {};
Option 2  if(!MyApplication) MyApplication = {};
Option 3: var myApplication = myApplication = myApplication || {}
Option 4: myApplication || (myApplication = {});
Option 5: var myApplication = myApplication === undefined ? {} : myApplication;

*/

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

Вариант 2 в порядке, но, кажется, не хватает var myApplication заранее или if(!window.myApplication) иначе если myApplication не входит в глобальную область, условие if(!myApplication) вызовет ошибку, не так ли?

Вариант 3 - тот, с которым у меня возникают проблемы: я понимаю, что myApplication = myApplication выполняется myApplication = myApplication, а myApplication в глобальной области (из-за var в начале). Моя проблема в том, что я не могу придумать случай, когда этот вариант делает что-то большее, чем вариант 1.

Вариант 4 в моих глазах был бы лучше написанным window.myApplication || (myApplication = {}) window.myApplication || (myApplication = {}) чтобы избежать ошибки, если myApplication не находится в глобальной области.

Вариант 5 исключает значения false-y, отличные от undefined но это хорошая идея? Если myApplication - пустая строка, остальная часть кода, скорее всего, потерпит неудачу, не так ли?

Кто-нибудь сможет пролить свет на различия между различными вариантами и, в частности, объяснить, почему вариант 3 описывается как более тщательный?

Ответ 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 || {}

это порядок, в котором происходят события:

  1. var myApplication создает глобальный, если он еще не существует, оставляет его нетронутым, если он
  2. myApplication || {} myApplication || {} оценивается и принимает либо значение в myApplication (если оно правдиво), либо {} (если нет); позвольте этому value1
  3. myApplication = value1 (тот, что посередине), и результат равен value1
  4. myApplication = value1 (один слева) выполняется снова без уважительной причины

Вариант 4 в моих глазах был бы лучше написанным window.myApplication || (myApplication = {}) window.myApplication || (myApplication = {}) чтобы избежать ошибки, если myApplication не находится в глобальной области.

В самом деле.

Вариант 5 исключает значения false-y, отличные от undefined но это хорошая идея? Если myApplication - пустая строка, остальная часть кода, скорее всего, потерпит неудачу, не так ли?

Да.