Перезаявленная глобальная переменная JavaScript переопределяет старое значение в IE

(создание отдельного вопроса после комментариев к этому: Javascript повторно объявил, что глобальная переменная переопределяет старое значение),

Я создаю глобально ограниченную по объему переменную с помощью нотации квадратной скобки и присваивая ему значение во внешнем js файле.

В другом js файле я объявляю var с тем же именем как то, которое я просто создал выше. Обратите внимание, что я не присваиваю значение. Так как это - redeclaration той же переменной, старое значение не должно быть переопределено, как описано здесь: http://www.w3schools.com/js/js_variables.asp

Создайте 2 файла JavaScript со следующим содержанием: Script1

//create global variable with square bracket notation
window['y'] = 'old';

Script2

//redeclaration of the same variable
var y;

if (!y) y = 'new';

alert(y); //shows New instead of Old in IE

Включайте эти 2 файла в свой файл HTML


 
 

  
  

 

Открытие этой страницы в Firefox и предупреждениях Chrome, 'старых', который является ожидаемым поведением. Однако в IE 8 страница на самом деле предупредит 'новый'

Какие-либо идеи о том, почему это происходит на IE?

9
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

Если вы ожидаете, что y будет глобальным, вы можете просто удалить строку var y во втором файл.

Причина в том, что, поскольку вы хотите, чтобы y в любом случае был глобальным, просто относитесь к нему как к глобальному и уже объявленному. Побочный эффект JavaScript, заключающийся в том, что переменные становятся глобальными при объявлении без префикса var , в этой ситуации играет вам на руку. Протестировано в IE8, работает отлично.

Редактировать: Что касается того, почему это происходит, я бы списал это на ошибку в сочетании обработки IE глобальных переменных в файлах и подъема объявлений. На самом деле, вы должны только объявлять любую переменную, но особенно глобальную, в одном месте. Вашей проблемы можно избежать, следуя этому практическому правилу.

4
ответ дан 4 December 2019 в 14:27
поделиться

Упрощенный тестовый пример:

<script>
    window.foo= 1;
</script>
<script>
    var foo;
    alert(foo);
</script>

И да, это абсолютно ошибка в движке IE JScript.

Почему это происходит? Почему IE делает какие-то безумные вещи? Сделайте раздраженный звук, двигайтесь дальше, постарайтесь не делать этого ...

9
ответ дан 4 December 2019 в 14:27
поделиться

Это происходит в IE, потому что строка повторного объявления устанавливает для y значение undefined. Затем проверка строки, если y не задана, проходит, и y изменяется на «новый».

Измените второй сценарий на:

//redeclaration of the same variable
var y;

alert(y); // is undefined in IE

if (!y) y = 'new';

alert(y); //shows New instead of Old in IE
1
ответ дан 4 December 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: