我是通过源的_.isFunction()
功能阅读和看到这条线使用的typeof(/./)==“功能”:为什么是下划线
if (typeof (/./) !== 'function') {
,我不明白为什么它的!那里。 /./
是一个似乎总是类型为object
的正则表达式。为什么_.isFunction
是重新定义如果/./
类型是function
?
我是通过源的_.isFunction()
功能阅读和看到这条线使用的typeof(/./)==“功能”:为什么是下划线
if (typeof (/./) !== 'function') {
,我不明白为什么它的!那里。 /./
是一个似乎总是类型为object
的正则表达式。为什么_.isFunction
是重新定义如果/./
类型是function
?
各种JavaScript引擎的一些版本已经允许调用RegExp
如使用.exec()
的另一种方式:
var pattern = /./;
pattern('abc');
pattern.exec('abc');
而且,因为他们可赎回,typeof
considered them function
s:
类型val:Object(native或host并执行[[Call]])
结果:"function"
但据我所知,目前的版本不会显示这种行为,并会抛出TypeError
。但是,如果您担心向后兼容性问题,则可能需要检查它是否为Underscore。
@ruakh根据我所知道的,它们应该配对 - 除非引擎使用[[[Call]] [](http://es5.github.io/#x15.3.4.5.1)的alt来使它们可以被调用。你知道一个例子吗? –
哎呀,对不起,我误解了Dogbert链接的答案,并认为Firefox 3.6.13使用了这样的引擎。所以我上面的评论是(可能)是错误的;我会删除它。 – ruakh
在这里回答:http://stackoverflow.com/questions/5054352/why-use-typeof-for-identifying-a-function/5054396#5054396 – Dogbert
啊,所以检查是为了避免意外地有正则表达式认为功能?尼斯。很好的问题。 – ZenMaster
“为什么不定义_.isFunction” - 正在重新定义。原来的toString()定义是两个块。 – Rup