Node.js导入的模块函数无法访问app.js内类实例与变量问题
问题成因
核心是两个基础规则的误解:
- 第一:JS采用词法(静态)作用域,作用域绑定只和代码定义的位置有关,和调用位置完全无关。
箭头函数和普通函数的差异仅在于是否绑定独立的this,并不改变作用域绑定的规则:不管是什么类型的函数,能访问的变量范围,在你写这个函数代码的时候就已经确定了,和后续在哪调用、怎么调用没有关系。 - 第二:Node.js的CommonJS模块自带独立作用域,不同文件的顶层作用域完全隔离。
你在func.js中定义箭头函数的时候,它的外层作用域就是func.js的模块作用域,这个作用域里从未声明过elf1变量,自然找不到对应值。你把它引入到app.js调用,只是把函数本身作为值传递过去,不会改变函数原本的作用域绑定关系。
常见解决方案
你完全不需要挂载到全局对象污染全局作用域,常规的做法有两种:
- 调用时把
elf1作为参数传入:
// func.js let func1 = (elf)=>{ elf.shout() } module.exports = func1; // app.js 调用时传参 func1(elf1);
- 导出工厂函数提前绑定目标变量:
// func.js module.exports = (elf) => { return () => { elf.shout() } } // app.js 引入时先传参生成绑定后的函数 let func1 = require('./func')(elf1); func1();
内容的提问来源于stack exchange,提问作者JohnyClash
相关产品推荐
相关产品推荐

