«x = x | | 4» генерирует ошибку `ReferenceError: x не определен`

#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 является ли операция присваивания, а не сравнения