Я столкнулся с интересной проблемой на днях и задавался вопросом, может ли кто-то пролить свет на то, почему это происходит. Вот что я делаю (для целей этого примера я немного озвучил пример):
- Я создаю глобальную переменную в области видимости, используя обозначение в квадратных скобках, и присваиваю ей значение.
Позже я объявляю переменную с тем же именем, которое я только что создал выше. Обратите внимание, я не назначаю значение. Поскольку это переопределение той же переменной, старое значение не должно быть переопределено, как описано здесь: http://www.w3schools.com/js/js_variables.asp
//create global variable with square bracket notation
window['y'] = 'old';
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old
Проблема в том, что старое значение действительно переопределяется и в приведенном выше примере. предупреждение показывает «новый» вместо «старый». Почему?
Я предполагаю, что другой способ сформулировать мой вопрос состоит в том, чем вышеприведенный код отличается с точки зрения семантики от кода ниже:
//create global variable
var y = 'old';
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows Old
Обновление 1 : Основываясь на некоторых комментариях и ответах, я перефразирую пример, чтобы больше отражать мою первоначальную проблему.
Создайте 2 файла javascript со следующим содержанием:
Script1
//create global variable with square bracket notation
window['y'] = 'old';
Скрипт2
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old in IE
Включите эти 2 файла в ваш HTML-файл
<html>
<head></head>
<body>
<script type="text/javascript" src="my.js"></script>
<script type="text/javascript" src="my2.js"></script>
</body>
</html>
Открытие этой страницы в Firefox и Chrome предупреждает «старый», что является ожидаемым поведением. Однако в IE 8 страница на самом деле будет предупреждать «новый»
Обновление 2 Вопрос перенесен сюда: Пере объявленная глобальная переменная javascript переопределяет старое значение в IE