Это меня раздражало, поэтому у меня есть игра и некоторые тесты, и вот мои выводы.
Я покажу два разных сценария, которые дают два разных результата, объясняя, почему кто-то может использовать один над другим. Причины использования либо, однако, сводятся к кодеру и будут основываться на эффекте, который они хотят осуществить.
Обратите внимание, что, например, я буду использовать фактические значения, а не пустые объекты.
Обычно, можно было бы ожидать, чтобы увидеть следующий пример использования:
var cc = cc || 1;
Это создает новую переменную с именем cc
и дает либо значение существующего (в пределах одной и той же области видимости) переменной, или по умолчанию значение 1
. Этот метод НЕ изменяет исходную переменную, хотя на практике это, по-видимому, повлияет на то, что оно изменилось, поскольку впоследствии вы не можете ссылаться на оригинал из-за того, что оно имеет то же имя.
Это можно проверить, используя различные имена переменных, например:
var aa;
alert(aa);
var cc = aa || 1;
alert(aa);
alert(cc);
(Example) Здесь вы можете увидеть, что aa
никогда не меняется.
Далее мы рассмотрим код в вопросе:
var cc = cc = cc || 1;
Это будет на самом деле изменить исходную переменную и создать новый локальный. Опять же, это непросто увидеть эффекты, в то время как переменные имеют одинаковое имя. Однако, если мы будем делать то же самое изменение названия, как указано выше, мы можем увидеть реальный эффект:
var aa;
alert(aa);
var cc = aa = aa || 1;
alert(aa);
alert(cc);
(Example) На этот раз мы можем видеть, что aa
действительно переодеться.
В заключение вы никогда не сможете увидеть какой-либо эффект от использования одного над другим (с теми же именами переменных), но мне любопытно, какие последствия могут произойти, если возможно ссылаться на оригинал где-то до назначение, и, следовательно, выбор, который будет использоваться, фактически будет иметь эффект. Я посмотрю, смогу ли я найти что-то, чтобы показать это в действии.
выглядит ошибкой для меня – musefan
Да, это определенно ошибка. –
Возможно, он оценивается как 'var cc = (cc = cc || {});', поэтому он просто устанавливает локальные и глобальные переменные 'cc'? – VisioN