2009-12-10 93 views
4

假設我有一個簡單的函數定義什麼都不做:function fn() { }的JavaScript的toString怪癖

現在,當我運行toString(fn)我得到「的翻譯:」。當我運行toString.call(fn)時,我得到「[object Function]」。有誰知道爲什麼我在使用call方法時得到更具體的類型?

編輯:此行爲展示在FireFox通過FireBug控制檯運行。 toString.constructortoString.call.constructor都產生「Function()」。

+0

請詳細說明。你在JavaScript解釋器中調用了這個嗎?哪一個?犀牛? jrunscript?哪個版本? – 2009-12-10 18:10:03

+0

有趣的是,據我所知,toString是一個在Object原型上定義的方法,而不是一個內置函數。所以,問題是,你打電話給誰的toString,它收到了什麼論據? – 2009-12-10 18:10:54

+0

我通過Firebug 1.4.5控制檯運行此代碼。我很好奇的原因是因爲我在jQuery源代碼中看到toString.call像這樣使用並開始試驗。我按照問題所示正確運行代碼(所以不需要「someobject.toString」)。 – 2009-12-10 18:15:33

回答

11

toString不接受參數,因此toString(fn)toString()相同,它返回隱式全局對象,轉換爲字符串。 toString.call(fn)調用global.toString這樣傳遞函數對象,但由於global.toString是Object的一種方法,所以結果與Function.toString不同。

+0

+1用於揭示「隱式全局對象」! – 2009-12-10 18:28:46

+0

還要感謝我的實驗中的明顯缺陷:我忘記了我沒有將fn作爲參數傳遞給調用,而是作爲上下文!現在這一切都有意義。 – 2009-12-10 18:33:49