2011-12-27 37 views
11

有人可以解釋這一點嗎? IE8IE8`window.fn!== fn`

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

上「有名函數表達式」,這是你有什麼有非常好的閱讀:http://kangax.github.com/nfe/ – InfinitiesLoop 2011-12-27 18:49:57

回答

13

由於一個IE的錯誤,在命名的功能表達創建具有功能的單獨副本單獨的本地foo變量。

More info

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

這就是事情變得有趣。或者說 - 完全堅果。在這裏,我們看到了必須處理兩個不同的對象的危險 - 增加其中一個顯然不會修改另一個;如果您決定使用緩存機制並將某些東西存儲在f的屬性中,然後嘗試將其作爲g的一個屬性進行訪問,那麼這可能會非常麻煩,並認爲它與您正在使用的是同一個對象。

+0

真棒,謝謝。我已經閱讀過,但直到現在,它從未受到過它的影響。 – 2011-12-27 18:46:37

+2

再一次,JavaScript是一團糟。 – 2011-12-28 00:48:02

1

如果你有興趣糾正這個問題,這將起作用。

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

或者只是擺脫名稱 – SLaks 2011-12-27 18:32:15