(создание отдельного вопроса после комментариев к этому: Javascript повторно объявил, что глобальная переменная переопределяет старое значение),
Я создаю глобально ограниченную по объему переменную с помощью нотации квадратной скобки и присваивая ему значение во внешнем js файле.
В другом js файле я объявляю var с тем же именем как то, которое я просто создал выше. Обратите внимание, что я не присваиваю значение. Так как это - redeclaration той же переменной, старое значение не должно быть переопределено, как описано здесь: http://www.w3schools.com/js/js_variables.asp
Создайте 2 файла JavaScript со следующим содержанием: Script1
//create global variable with square bracket notation
window['y'] = 'old';
Script2
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old in IE
Включайте эти 2 файла в свой файл HTML
Открытие этой страницы в Firefox и предупреждениях Chrome, 'старых', который является ожидаемым поведением. Однако в IE 8 страница на самом деле предупредит 'новый'
Какие-либо идеи о том, почему это происходит на IE?
Если вы ожидаете, что y
будет глобальным, вы можете просто удалить строку var y
во втором файл.
Причина в том, что, поскольку вы хотите, чтобы y
в любом случае был глобальным, просто относитесь к нему как к глобальному и уже объявленному. Побочный эффект JavaScript, заключающийся в том, что переменные становятся глобальными при объявлении без префикса var
, в этой ситуации играет вам на руку. Протестировано в IE8, работает отлично.
Редактировать: Что касается того, почему это происходит, я бы списал это на ошибку в сочетании обработки IE глобальных переменных в файлах и подъема объявлений. На самом деле, вы должны только объявлять любую переменную, но особенно глобальную, в одном месте. Вашей проблемы можно избежать, следуя этому практическому правилу.
Упрощенный тестовый пример:
<script>
window.foo= 1;
</script>
<script>
var foo;
alert(foo);
</script>
И да, это абсолютно ошибка в движке IE JScript.
Почему это происходит? Почему IE делает какие-то безумные вещи? Сделайте раздраженный звук, двигайтесь дальше, постарайтесь не делать этого ...
Это происходит в IE, потому что строка повторного объявления устанавливает для y
значение undefined. Затем проверка строки, если 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