ES模块中使用eval()定义变量出现ReferenceError的问题求助
问题原因与解决方案
报错原因
因为你用type="module"加载脚本,ES模块拥有独立的作用域,而eval在模块环境中运行时,不会将变量注入到当前作用域——它的变量仅在eval自身的局部作用域内有效,外部无法访问。而普通脚本(非模块)运行在全局作用域,eval的变量会挂载到全局,因此能正常访问。
替代方案:用对象存储动态实例
不要用eval动态创建变量,这种写法既不安全也不利于维护。改用对象来存储动态生成的实例,完全能满足需求:
修改classes.js如下:
import { classesArray } from "./variables.js"; // 用对象存储所有动态创建的实例,替代动态变量 const instanceStore = {}; // 修正原代码中的WaitForElement bug let WaitForElement = element => { if (typeof element !== "undefined") { console.log(element); } else { setTimeout(() => WaitForElement(element), 250); } }; export class exampleClass{ constructor(name){ this.name = name; } } export function createExampleClass(){ let instanceKey = "exampleObject" + classesArray.length.toString(); // 直接将实例存入对象,无需eval instanceStore[instanceKey] = new exampleClass("random"); classesArray.push(instanceStore[instanceKey]); } export function createExampleClasses(){ createExampleClass(); createExampleClass(); }
额外说明
原代码中的WaitForElement存在bug:setTimeout(WaitForElement(),250)会立即执行WaitForElement,且没有传递参数,修正为箭头函数包裹后,才能正确延迟执行并传递参数,避免无限递归问题。
内容的提问来源于stack exchange,提问作者yjzhou
相关产品推荐
相关产品推荐

