如何在JavaScript模块的全局作用域中访问模块内函数创建的const变量synth
如何在JavaScript模块的全局作用域中访问模块内函数创建的const变量synth
嘿,我来帮你搞定这个问题!你遇到的核心问题是模块脚本的作用域特性——模块里的变量默认是模块级作用域,不是全局的,而且库要求你用const声明synth,那我们有两个简单且安全的解决办法:
方案一:把synth的引用挂载到window对象
这个方法直接把你用const创建的synth实例引用赋值给全局的window对象,既满足库对const的要求,又能让全局函数访问到它:
<script type='module'> import { Synthetizer } from "xxx.js"; window.test = () => { // 依旧用const声明synth,完全符合库的要求 const synth = new Synthetizer(context.destination,soundFontBuffer); // 把synth的引用挂载到window上,让全局能访问 window.synth = synth; }; window.customfunction = () => { // 先判断synth是否已初始化,避免报错 if (window.synth) { window.synth.setProperty(); } else { console.error("请先调用test()初始化synth哦!"); } }; </script>
原理很简单:const声明的变量是块级作用域,但我们只是把这个变量指向的对象引用赋值给了window的属性,并没有改变synth本身的声明方式,所以库的功能完全不受影响。
方案二:使用模块级变量(更推荐)
如果你不想污染全局作用域,可以在模块顶部声明一个模块级的变量,用来存储synth的引用,这样模块内的所有函数都能访问它,同时依然保持const的局部声明:
<script type='module'> import { Synthetizer } from "xxx.js"; // 在模块顶部声明一个模块级变量,专门存储synth实例 let moduleSynth; window.test = () => { // 还是用const声明局部变量,满足库的要求 const synth = new Synthetizer(context.destination,soundFontBuffer); // 把实例引用赋值给模块级变量 moduleSynth = synth; }; window.customfunction = () => { if (moduleSynth) { moduleSynth.setProperty(); } else { console.error("请先调用test()初始化synth哦!"); } }; </script>
这个方案更优雅,因为模块级变量只在当前模块内部可见,不会和其他全局变量冲突,同时你的customfunction是在模块内部定义后挂载到window的,所以它能正常访问这个模块级变量。
你之前尝试用var导致库失效,大概率是因为var的变量提升或者作用域问题,而这两个方案都避开了这个坑,同时完全满足库对const的要求。
备注:内容来源于stack exchange,提问作者Samul
相关产品推荐
相关产品推荐

