JavaScript调用函数报'B is not a function'错误如何解决
错误原因
触发B is not a function的核心原因是当前作用域下没有可直接访问的名为B的函数:你只把B函数挂载到了CommonJS模块的exports导出对象上,没有在模块作用域内单独声明B标识符,直接写B()调用时,JS引擎沿作用域链查找不到B的定义,就会抛出类型错误。
修复方法
两种常用修复方式,根据代码习惯选择即可:
- 方法1:调用时显式引用exports对象上的B方法
exports.createRecord = function A() { exports.B(); }; exports.B = () => { // B函数业务逻辑 }
- 方法2:先在模块作用域内声明B函数,再挂载到exports上(推荐)
// 先声明内部可直接调用的B函数 const B = () => { // B函数业务逻辑 } exports.createRecord = function A() { B(); // 作用域内可直接访问B,不会报错 }; // 再把B挂载到导出对象供外部使用 exports.B = B;
推荐优先用方法2,后续如果调整导出规则、重构内部逻辑,内部调用B的代码不需要同步修改,维护成本更低。
其他常见触发场景排查
如果按上面改完仍报错,检查两个高频问题:
- 是否存在执行时序问题:如果在
exports.B = () =>{}这行赋值代码执行前就调用了createRecord,此时exports.B还是undefined,调用同样会报类型错误 - 是否存在变量名冲突:检查A函数内部、外层模块作用域有没有声明过同名
B变量,且赋值了非函数类型的值(比如对象、字符串、null等)
内容的提问来源于stack exchange,提问作者Tejas Mehta
相关产品推荐
相关产品推荐

