javascript - 在 JavaScript 中测试函数的最佳方法?

标签 javascript function

我对此做了很多研究,但似乎使用的方法不一致且多种多样。

以下是我过去使用的一些方法:

/* 1: */  typeof myFunc === 'function'
/* 2: */  myFunc.constructor === Function
/* 3: */  myFunc instanceof Function

作为我研究的一部分,我了解了一些知名图书馆是如何做到这一点的:

 /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
 /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
/* Prototype 1.6: */  typeof object == "function"
      /* YUI 2.6: */  typeof o === 'function'

我很惊讶有这么多不同的方法被使用,确定一个可接受的测试已经达成一致?我完全不知道 jQuery 1.2.6 版本的意图是什么,看起来有点 OTT...

那么,我的问题仍然存在,测试功能的最佳*方法是什么?

我也希望能深入了解上述某些方法,尤其是 jQuery 1.2.6 的方法。 (我能看到他们在做什么,这看起来很奇怪)

[*] 我所说的“最佳”是指最广泛接受的跨浏览器兼容方法。


编辑:是的,我知道之前已经讨论过,但我仍然希望就最有效的方法进行一些讨论。为什么有这么多不同的使用方法?

到目前为止,关于 SO 的讨论只提到了 typeof 运算符(大部分),但没有人暗示替代方法的有效性。

最佳答案

测试对象是否为函数的最佳方法是 typeof myFunc === 'function'。如果您正在使用库,请使用该库的函数测试:jQuery.isFunction(myFunc)

当使用 typeof 时,可能被误报为函数。这是非常罕见的,但是有一个库可以消除这些不一致。 jQuery 解决了这些问题:

  • Firefox 使用 typeof document.createElement("object") 报告功能
  • Safari 报告功能 typeof document.body.childNodes
  • 旧版本的 Firefox 将正则表达式报告为函数(在 3.0 中不是这种情况)。
  • 一些 IE 内置的全局函数 (alert) 和一些节点方法 (getAttribute) 被报告为“对象”类型。

使用 instanceof 而不是 typeof 可以避免其中的一些问题。例如,document.createElement("object") instanceof Function 在 Firefox 中为 false

第一个方法的诞生可以在the original ticket (#3618)的评论中查看.新方法来自changeset 5947似乎是 Resig 发明来解决 IE memory leaks .它可能更慢,但更小,更干净。

就工作方式而言,== 和 === 之间没有太大区别,但严格评估速度稍快,因此更受欢迎。

关于javascript - 在 JavaScript 中测试函数的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405164/

相关文章:

javascript - 在 Handlebars 中,如何转义字段名称中的特殊字符?

javascript - 如何在 Socket.io/express-sessions 中访问/保存授权事件的 session 数据?

c++ - 以对象为参数的函数,作为另一个函数的参数

python - 如何使用相同的参数正确调用多个函数?

c - 在函数调用期间结构更改的 union 内的结构

php - 当数据库中有新条目时显示新条目的最佳方式

Javascript/HTML 灰色 radio 列表?

javascript - 格式化 RSS 提要日期和时间

C++ 递归函数

用于未调用 NodeJS 嵌套函数的 C++ 插件