为什么typeof(/./)!=='function'在下划线中使用

sis*_*onb 17 javascript underscore.js

我正在阅读该_.isFunction()函数的源代码,并看到了这一行:

if (typeof (/./) !== 'function') {
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样././是一个似乎总是有类型的正则表达式object.为什么不会_.isFunction重新定义,如果/./类型是function

Jon*_*ski 16

某些版本的各种JavaScript引擎允许调用 RegExp另一种使用方式.exec():

var pattern = /./;

pattern('abc');
pattern.exec('abc');
Run Code Online (Sandbox Code Playgroud)

并且,因为它们是可调用的,所以typeof认为它们function:

val的类型:对象(本机或主机,并实现[[Call]])
结果:"function"

据我所知,当前版本不会出现这种行为,并会抛出一个TypeError.但是,如果你关注向后兼容性,就像Underscore一样,你可能需要检查它.