2013-07-11 166 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

相关问题