Глобальная переменная переопределенного 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