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

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

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

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

Создайте 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 страница будет на самом деле предупреждать "новый"

Любые идеи о том, почему это происходит в IE?

Ответ 1

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

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

Изменить. Что до этого происходит, я помешал бы ему просто быть ошибкой в ​​комбинации обработки IE глобальных переменных между файлами и объявлениями. Действительно, вы должны только объявлять какую-либо переменную, но особенно глобальную, в одном месте. Эту проблему можно избежать, следуя этому правилу.

Ответ 2

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

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

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

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

Ответ 3

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

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

//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