Переопределенная глобальная переменная JavaScript переопределяет старое значение в IE - PullRequest
9 голосов
/ 14 апреля 2010

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

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

В другом js-файле я объявляю переменную с тем же именем, которое я только что создал выше. Обратите внимание, я не назначаю значение. Поскольку это переопределение той же переменной, старое значение не должно быть переопределено, как описано здесь: 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?

Ответы [ 3 ]

9 голосов
/ 14 апреля 2010

Упрощенный контрольный пример:

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

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

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

4 голосов
/ 14 апреля 2010

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

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

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

1 голос
/ 14 апреля 2010

Это происходит в IE, потому что строка повторного объявления устанавливает y в неопределенное значение. Затем тестирование линии, если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...