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

JavaScript中如何检测eval解析动态变量时的is not defined报错

动态eval变量的未定义检测方案

错误原因

原有代码触发报错、条件不生效的核心问题有两个:

  • 直接对未声明的变量名执行eval会直接抛出ReferenceError,代码会直接中断,根本不会执行后续的全等判断逻辑
  • typeof操作符的返回值永远是字符串,原有判断typeof xxx === undefined写法错误,正确写法应该是typeof xxx === 'undefined',同时判断逻辑里还写错了变量名,把dynamic_var写成了未定义的created_node

可直接使用的解决方案

方案1:用try-catch包裹eval逻辑(兼容性最好,覆盖所有场景)

这是最稳妥的处理方式,直接捕获eval执行时抛出的引用错误,判断变量是否存在:

var Hello_0 = "Hello 0 !";
console.log(" Hello_0 is: " + eval("Hello_"+0));

var dynamic_var = "Hello_"+1;
var dynamicValue;
try {
  dynamicValue = eval(dynamic_var);
  // 走到这里说明变量已声明,可继续判断值的情况
  if (dynamicValue === undefined) {
    console.log("动态变量已声明,但值为undefined");
  } else if (dynamicValue === null) {
    console.log("动态变量已声明,但值为null");
  } else {
    console.log("动态变量值为:" + dynamicValue);
  }
} catch (e) {
  // 捕获到引用错误说明变量未声明
  if (e instanceof ReferenceError) {
    console.log("动态变量" + dynamic_var + "未声明");
  } else {
    // 其他错误的处理逻辑
    console.log("执行出错:" + e.message);
  }
}

方案2:调整eval内容,内置typeof判断避免抛出错误

你也可以直接把typeof判断写到eval的执行字符串里,利用typeof未声明变量不会抛错的特性,避免触发引用异常:

var dynamic_var = "Hello_"+1;
if (eval(`typeof ${dynamic_var} === 'undefined'`)) {
  console.log("动态变量未声明或值为undefined");
} else {
  console.log("动态变量值为:" + eval(dynamic_var));
}

推荐替代方案

非必要场景下不建议使用eval,动态变量完全可以用对象的键值对来实现,性能和安全性都高很多:

// 不用eval的实现方式
const dynamicVars = {
  Hello_0: "Hello 0 !"
};
const key = "Hello_"+1;
if (dynamicVars.hasOwnProperty(key)) {
  console.log("值为:" + dynamicVars[key]);
} else {
  console.log(key + "不存在");
}

内容的提问来源于stack exchange,提问作者Extrange planet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:15:03