使用eval()语句时为何出现value未定义的引用错误?
问题分析与解决
重现代码
var count = 0 class node{ data; leftchild; rightchild; constructor(data){ this.data = data; } addleftchild(value){ this.leftchild = value } addrightchild(value){ this.rightchild = value } // getter get data(){ return this.data; } } function addnode(num){ eval("let value = nod"+num+".data") console.log(value) }
报错信息
tree.html:42 Uncaught ReferenceError: value is not defined at addnode
错误原因
eval内部用let声明的value属于eval自身的块级作用域,外部的console.log(value)无法访问该变量,导致未定义错误。- 通过字符串拼接全局变量名(
nod+num)的写法依赖全局作用域,代码耦合度高,且存在安全风险。
解决方案
方案1:用对象统一存储节点(推荐)
将所有节点存入一个对象,避免依赖全局变量和eval,代码更可控:
// 创建节点存储容器 const nodes = {}; // 示例:创建节点并存入容器 nodes.nod1 = new node(10); nodes.nod2 = new node(20); function addnode(num){ const nodeKey = `nod${num}`; // 先校验节点是否存在 if(nodes[nodeKey]){ const value = nodes[nodeKey].data; console.log(value); } else { console.log(`节点 ${nodeKey} 不存在`); } } // 调用示例 addnode(1); // 输出 10
方案2:修复eval作用域问题(不推荐)
若必须使用eval,可将变量声明改为var(函数作用域),或直接在eval内完成打印:
// 方式1:用var声明变量 function addnode(num){ eval(`var value = nod${num}.data`); console.log(value); } // 方式2:直接在eval中执行打印 function addnode(num){ eval(`console.log(nod${num}.data)`); }
内容的提问来源于stack exchange,提问作者muhammad ingar
相关产品推荐
相关产品推荐

