2011-06-14 150 views
9

任何人都可以解釋爲什麼下面兩個不相等?我基本上試圖弄清楚幕後發生了什麼。我的理解是,他們都提到相同的功能,但似乎並非如此。函數參考 - 請指教!

var foo = function bar() {} 

typeof foo //"function" 
typeof bar //"function" 

foo === bar //false 
foo == bar //false 
+2

你是否按照我們看到的順序執行它? – 2011-06-14 16:04:01

+0

只是FYI,如果你想讓它們引用相同的函數,你需要'var foo = function(){},bar = foo;'或'bar(){}; var foo = bar'。那麼如果你比較它們,它們將是平等的。 – brymck 2011-06-14 16:19:50

+1

您必須使用IE8或更低版本。這是一個已知的錯誤,不僅「bar」泄漏到封閉變量作用域中,而且還創建了一個唯一的函數對象並將其分配給「bar」。這就是爲什麼'bar'是一個函數,但'foo'不等於'bar'。 – user113716 2011-06-14 16:43:09

回答

5

我不知道你,但我的瀏覽器爲typeof bar

typeof bar //"undefined" 

演示http://jsfiddle.net/gaby/t8Czr/


bar參考方法僅僅是方法本身內部提供返回undefined ..

+0

你說得對。我正在閱讀一篇文章並在Firebug控制檯中進行測試,並認爲我得到了我目睹的結果。不幸的是,我執行的確切代碼不再存在。 – 2011-06-14 17:01:43

2

Bar i沒有定義。酒吧只存在於foo的範圍內。

如果您先聲明酒吧,然後設置foo等於酒吧,您的結果將如預期。

2

由於賦值爲foo,這是一個命名函數表達式。在一個命名的函數表達式中,函數的名稱僅在函數本身的封閉範圍內可用,但不在外部。

外面它將簡單地是未定義的。

var foo = function bar() { typeof bar; /* function */ }; 
bar; // undefined 

只好分配給foo沒有去過那裏,這將是一個函數聲明和標識符bar想在整個封閉的範圍已面市,被宣佈爲功能,甚至之前。

typeof bar; // function 
function bar() {} 

這是一個good article理解命名函數表達式的工作,他們從函數聲明的區別。