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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:25:00