最直接可靠的方式是用 Object.prototype.toString.call() 检查返回值是否为 "[object Function]",它兼容性好、跨 iframe 稳定、不因未定义变量报错,且能准确识别所有函数类型。

最直接可靠的方式是用 Object.prototype.toString.call() 检查返回值是否为 "[object Function]"。它不依赖运行时环境,能准确识别所有函数类型(包括箭头函数、类方法、异步函数),且在跨 iframe 场景下依然稳定。
推荐:用 toString.call 判断函数类型
这是目前兼容性最好、最严谨的方法:
- 不会因变量未定义而抛错(比如
typeof undefinedVar会报ReferenceError,但toString.call(undefinedVar)安全返回"[object Undefined]") - 能区分函数与普通对象,不受
constructor被篡改的影响 - 对箭头函数、生成器函数、async 函数均返回
"[object Function]"
示例代码:
function isFunction(fn) {<br> return Object.prototype.toString.call(fn) === '[object Function]';<br>}
isFunction(() => {}) // true<br>isFunction(function() {}) // true<br>isFunction(class {}.method) // true<br>isFunction({}) // false<br>isFunction(null) // false
常用替代:typeof 检查(简单场景够用)
日常开发中,typeof fn === 'function' 是最简洁的写法,语义清晰、性能好:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 适用于已知变量已声明或已定义的上下文(如参数校验、回调存在性检查)
- 对所有函数形式(含箭头函数、class 中的 method)都返回
"function" - 但注意:
typeof undeclaredVar会直接报错,不能用于检测全局未定义的函数名
安全写法(避免 ReferenceError):
function isFunction(fn) {<br> return typeof fn === 'function';<br>}<br>// 调用前确保 fn 已定义,或传参由调用方保证慎用:instanceof Function
虽然语法直观,但存在明显缺陷:
- 在跨 iframe 或不同 window 环境中,
fn instanceof Function可能返回false,因为不同上下文的Function构造函数不是同一个引用 - 无法识别通过
new Function()创建的函数在某些旧引擎中的行为差异 - 不适用于
undefined或null,会静默返回false,但缺乏明确性
不建议:eval + typeof 或 constructor 比较
这些方式有明确风险或不可靠性:
-
typeof eval('funcName') === 'function':eval存在严重安全隐患和性能开销,现代项目应禁止使用 -
fn.constructor === Function:constructor属性可被任意修改,例如fn.constructor = null后判断即失效 -
typeof fn === 'function' && fn instanceof Function:叠加并不能提升可靠性,反而增加冗余和潜在跨环境问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










