NodeJS项目导入外部函数时this作用域变更异常问题咨询
问题原因
你遇到的报错本质是箭头函数的静态this绑定规则和NodeJS CommonJS模块的顶层作用域规则共同作用的结果:
- 箭头函数的this不会随调用方式改变,而是在定义阶段就继承外层作用域的this,和普通函数运行时动态绑定this的逻辑完全不同。
- 你放在
utility.js里的导出函数是箭头函数,定义时的外层作用域是utility.js的模块顶层作用域。NodeJS的CommonJS模块顶层this指向的是当前模块的module.exports对象,而非你调用时的MyClass实例,所以你运行时访问this.property1实际是访问utility.js的module.exports上的property1,自然是undefined。 - 当你把箭头函数直接写在
main.js的foo()方法内部时,箭头函数定义阶段的外层作用域是foo方法的作用域:foo作为类的普通实例方法,它的this指向调用它的MyClass实例,所以箭头函数继承到的this就是该实例,就能正常读取到this.property1。
修复方案
方案1:改用普通函数+手动绑定this
把utility.js的箭头函数改为普通函数,调用时手动绑定类实例的this:
// utility.js module.exports = function() { console.log(this.property1); }
// main.js的foo方法调用时绑定this foo(){ utilityFunc.call(this); }
方案2:直接传参(更推荐,避免this绑定混乱)
不依赖this传递参数,直接把需要的值作为入参传给工具函数:
// utility.js module.exports = (property1) => { console.log(property1); }
// main.js的foo方法调用 foo(){ utilityFunc(this.property1); }
内容的提问来源于stack exchange,提问作者nostyn
相关产品推荐
相关产品推荐

