IE8 `window.fn! == fn`

Может кто-нибудь объяснить это? IE8

( function(){
    window.foo = function foo(){};
    console.log( window.foo === foo ); // false
}() );

Ответ 1

Из-за ошибки IE названное выражение функции создает отдельную локальную переменную foo с отдельной копией функции.

Дополнительная информация:

var f = function g(){};
f === g; // false

Здесь все становится интересным. Вернее - полностью орехи. Здесь мы видим опасность иметь дело с двумя различными объектами - увеличение одного из них, очевидно, не изменяет другого; Это может быть довольно неприятным, если вы решили использовать, скажем, механизм кэширования и сохранить что-то в свойстве f, а затем попытались получить доступ к нему как свойству g, считая, что это тот же объект, с которым вы работаете.

Ответ 2

Если вы заинтересованы в исправлении проблемы, это будет работать.

( function(){
    var f = function foo(){};
    window.foo = f;
    alert( window.foo === f ); // false
}() );