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
相关产品推荐
相关产品推荐

