На днях я столкнулся с интересной проблемой, и мне было интересно, может ли кто-нибудь пролить свет на то, почему это происходит. Вот что я делаю (для целей этого примера я несколько упростил пример):
- Я создаю глобальную переменную, используя обозначение квадратных скобок и присваивая ей значение.
Позже я объявляю переменную с тем же именем, что и только что созданная выше. Обратите внимание, я не присваиваю значение. Поскольку это повторное объявление той же переменной, старое значение не следует переопределять, как описано здесь: 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 перемещен сюда: Redeclared глобальная переменная javascript переопределяет старое значение в IE