2013-07-11 165 views
17

我是通過源的_.isFunction()功能閱讀和看到這條線使用的typeof(/./)==「功能」:爲什麼是下劃線

if (typeof (/./) !== 'function') { 

,我不明白爲什麼它的!那裏。 /./是一個似乎總是類型爲object的正則表達式。爲什麼_.isFunction重新定義如果/./類型是function

+4

在這裏回答:http://stackoverflow.com/questions/5054352/why-use-typeof-for-identifying-a-function/5054396#5054396 – Dogbert

+0

啊,所以檢查是爲了避免意外地有正則表達式認爲功能?尼斯。很好的問題。 – ZenMaster

+3

「爲什麼不定義_.isFunction」 - 正在重新定義。原來的toString()定義是兩個塊。 – Rup

回答

16

各種JavaScript引擎的一些版本已經允許調用RegExp如使用.exec()的另一種方式:

var pattern = /./; 

pattern('abc'); 
pattern.exec('abc'); 

而且,因爲他們可贖回typeof considered them functions

類型val:Object(native或host並執行[[Call]])
結果:"function"

但據我所知,目前的版本不會顯示這種行爲,並會拋出TypeError。但是,如果您擔心向後兼容性問題,則可能需要檢查它是否爲Underscore。

+0

@ruakh根據我所知道的,它們應該配對 - 除非引擎使用[[[Call]] [](http://es5.github.io/#x15.3.4.5.1)的alt來使它們可以被調用。你知道一個例子嗎? –

+0

哎呀,對不起,我誤解了Dogbert鏈接的答案,並認爲Firefox 3.6.13使用了這樣的引擎。所以我上面的評論是(可能)是錯誤的;我會刪除它。 – ruakh

相關問題