IE тупой, он не распознает, что window.varName
и var varName
имеют доступ к одной и той же переменной в некоторых случаях.
Когда встречается новый тег script, он сначала инициализирует все переменные, объявленные с помощью var.Он не запускает оператор var (часть, которая инициализирует его как «hiya»).Он просто инициализирует его как неопределенное.Это не будет сделано, если он был ранее объявлен с помощью var.
Если ваш код был в одном теге скрипта, эта ошибка не произошла бы.Кроме того, если первое объявление hiya было сделано с помощью var, эта ошибка также не возникнет.
В частности, во втором теге скрипта IE сначала ищет операторы var, он находит var var hiya = 1
;Затем он говорит, что hiya ранее не инициализировался с помощью операторов var (IE тупой, другие браузеры распознают, что window.hiya делает то же самое) и инициализирует hiya, перезаписывая window.hiya перед выполнением любого кода.
Возможные решения:
- Держите ваш код в пределах одного тега скрипта
- Не инициализируйте переменные с помощью window.hiYa
- Если вы не управляете одним изсценарии, убедитесь, что сценарий, который использует var, стоит первым
Последнее примечание, чтобы уточнить, что JS-парсеры делают с вашим кодом.Когда JS-анализатор увидит ваш код, он преобразует его в следующее:
<html>
<body>
<script type="text/javascript">
window.hiya = 'hiya';
</script>
<script type="text/javascript">
// IE is dumb, it doesn't recognize that hiya is already
// defined as window.hiya, so it's initialized to undefined here
var hiya;
if( false ) {
hiya = 1;
}
document.write( "typeof(hiya) = "+ typeof(hiya) );
</script>
</body>
</html>
Так что, если вы поместите все в один тег сценария, это и будет кодом (после того, как механизм JS переместил операторы varнаверх), так что вы можете видеть, что IE не может все испортить, так как ваше назначение window.hiya
будет после var, которое было перемещено наверх.
<html>
<body>
<script type="text/javascript">
var hiya;
window.hiya = 'hiya';
if( false ) {
hiya = 1;
}
document.write( "typeof(hiya) = "+ typeof(hiya) );
</script>
</body>
</html>