С основной проблемой можно ознакомиться здесь http://jsfiddle.net/Raynos/UxrVQ/. еще предстоит выяснить, почему IE перезаписывает window.hiya без проверки.
[Изменить]
Из спецификации. Страница 38:
Для каждого VariableDeclaration или VariableDeclarationNoIn в коде создайте свойство объекта переменной, имя которого является идентификатором в VariableDeclaration или VariableDeclarationNoIn, значение которого не определено, а атрибуты определяются типом кода. Если уже есть свойство объекта переменных с именем объявленной переменной, значение свойства и его атрибутов не изменяются.
Возможным объяснением может быть то, что в глобальной области IE различает объект window
и variable object
для глобальной области при объявлении переменных. В качестве альтернативы установка свойства для объекта window
напрямую может не задавать такое же свойство для объекта variable
. Если вы можете найти официальную спецификацию JScript или иметь исходный код IE, мы сможем выяснить, в чем именно заключается причуда.
[/Изменить]
Благодаря @TimDown и @JuanMendes, указывающим, что это проблема с тем, является ли запись свойства в объект окна объявлением переменной.
Проблема:
объявление переменной перемещается в начало блока. Даже если код мертв. В IE по какой-то причине он будет объявлять hiya как локальную переменную, даже если он классифицирует свойство с тем же именем, которое хранится в окне.
Пояснение:
Происходит то, что вы объявляете переменную с именем hiya. Оператор var автоматически удаляется в начало блока. Оператор if не является блоком, а функция. Таким образом, если код никогда не запускается в блоке, переменная все равно объявляется.
В firefox он распознает, что window.hiya является объявлением hiya.
В IE объявление во втором скрипте перезаписывает его
Что он делает на самом деле
В фаерфоксе:
// script block 1
var hiya; // window.hiya counts as a declaration
window.hiya = "hiya"; // set
// script block 2
if (false) hiya = 1;
document.write(...)
In IE:
// script block 1
window.hiya = "hiya";
// script block 2
var hiya; // redeclared here because window.hiya "isn't" a declaration
if (false) hiya = 1;
document.write(...)
Решение просто пространство имен. Вы используете одно и то же имя в двух местах и обращаетесь к нему под двумя разными именами. Либо используйте разные имена, либо используйте замыкания, чтобы дать локальную область.
person
Raynos
schedule
05.01.2011
if (!window.cci) var cci = {}
; Мне потребовалось некоторое время, чтобы добраться до сути. Рада, что и вы это теперь понимаете! - person Juan Mendes   schedule 06.01.2011