You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:47:17