#javascript
#javascript
Вопрос:
Почему x = x || 4
или даже x=(x||5)
генерирует ReferenceError: x is not defined
ошибку, но var x=x || 4
работает так, как ожидалось?
Ответ №1:
Это связано с тем, что сначала обрабатываются объявления переменных (подъем). На странице MDN на var
это хорошо объясняется:
Поскольку объявления переменных (и объявления в целом) обрабатываются до выполнения любого кода, объявление переменной в любом месте кода эквивалентно объявлению ее вверху. Это также означает, что переменная может казаться используемой до ее объявления. Такое поведение называется «подъем», поскольку создается впечатление, что объявление переменной перемещается в начало функции или глобального кода.
Таким образом, следующее также будет работать:
x = x || 4;
var x;
Комментарии:
1. Итак, почему
x=(x||5)
генерируется ошибка? Кроме того, я не хочу использоватьvar
, переменная должна быть объявлена глобально.2. Поскольку переменная
x
неизвестна анализатору, а попытка получить доступ к ее значению приводит к сбоюReferenceError
. Если вы действительно хотите использовать глобальные переменные, используйтеwindow.x = window.x || 4
синтаксис.3. Обратите внимание, что
x = window.x || 4
будет нормально работать в нестрогом режиме, но в строгом режиме выдает ошибку.4. Да, @raina77ow попал в точку. Но следует по возможности избегать использования подобных глобалов.
5.
x=5
не генерирует ошибку, так почему жеx = x||3
генерируется ошибка, хотя в обоих операторахx
она не объявлена заранее. Действительно также, для меняx = x||3
иx = window.x||3
кажется эквивалентным.
Ответ №2:
x = x || 4
означает присвоение переменной x или 4. если x равно нулю, переменной присваивается 4 x
.
Возможно, вы не объявили x
переменную. вот почему вы получаете x is not defined
Если вы попробуете ниже, это сработает :
var x;
x=x||4;
alert(x);
Это также будет работать :
x=x||4;
var x;
alert(x);
Ответ №3:
Вы пытаетесь использовать переменную, которая не была объявлена ранее. Это приводит к ошибке ссылки.
[редактировать] так много неправильных слов.
[выход] @grc все понял правильно.
Комментарии:
1.
x = x
является ли операция присваивания, а не сравнения