为何函数内变量可跨模块访问?模块间函数调用变量作用域解析
函数中的变量为何能跨模块访问?
代码示例
script1.js
let log = "log"; function a() { console.log(log); } export { a };
script2.js
import { a } from "./script1.js"; a(); // 输出: log console.log(log) // Uncaught ReferenceError: log is not defined
问题解析
这是**闭包(Closure)**和ES模块作用域共同作用的结果:
- 函数
a在script1.js的模块作用域中定义,它会捕获并保留自己所在的作用域环境。也就是说,a永远能访问到定义它时所在作用域里的log变量,不管这个函数被传递到哪个模块执行。 - ES模块的作用域是隔离的:
script2.js只能访问到script1.js显式导出的内容(这里是函数a),未导出的log对script2.js来说是完全不可见的,所以直接console.log(log)会触发引用错误。 - 当你在
script2.js中调用a()时,函数a的执行依然依赖它原本的作用域链,自然能找到log变量并输出值,和当前执行的模块环境无关。
简单总结:函数会“记住”自己定义时的作用域环境,哪怕被拿到别的模块执行,也能访问原作用域的变量;但模块不会把未显式导出的变量暴露给外部。
内容的提问来源于stack exchange,提问作者Fusscreme
相关产品推荐
相关产品推荐

