为什么使用 eval() 语句时未定义值

why do i get value not defined when using an eval() statment

提问人:muhammad ingar 提问时间:11/15/2023 更新时间:11/15/2023 访问量:41

问:

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;
            }

这是 im 使用的类

function addnode(num){
            eval("let value = nod"+num+".data")
            console.log(value) 

当我调用这个函数时,我得到的输出是 tree.html:42 未捕获的 ReferenceError:值未定义 在 addnode 问题似乎是当我尝试记录值时,它是未定义的

JavaScript EVAL

评论

2赞 Justinas 11/15/2023
问题是 - 为什么需要评估它?为什么不有元素数组,而不是做let value = globalObject[num].data
3赞 T.J. Crowder 11/15/2023
因为是块范围的,所以它只存在于调用的范围内。您可以在包含范围 () 中声明它,但您上面的内容是反模式(尤其是因为它不做任何事情来确保不是恶意代码)。请参阅此问题的答案,了解该怎么做(TL;DR - 使用数组)。letevallet value; eval("value = ...");num
0赞 VLAZ 11/15/2023
如果你有一个方法,它接受一个数字并对一个节点做一些事情,而这个节点与这个数字相关联,你为什么不使用一个将索引与一些数据关联的数组呢?还是将用作键的任何内容与一条数据相关联的地图?为什么这必须是 -ed 动态生成的变量名称?eval()

答:

2赞 gog 11/15/2023 #1

Eval 代码就像在块(引用)中一样执行,因此这

eval("let value = nod"+num+".data")
console.log(value) 

大致相同

{
   let value = nod5.data
}
console.log(value) // error because 'value' didn't survive the block

您可以通过赋值给现有变量来解决此问题:

let value
eval("value = nod" + num + ".data")

或者将作业移到外面eval

let value = eval("nod" + num + ".data")

当然,这个问题仍然悬而未决,你是否首先需要这里。我想你在这里更需要一个数组,这样你就可以简单地使用动态变量来代替动态变量。evalnod5nodes[5]

评论

0赞 muhammad ingar 11/15/2023
谢谢,我想我应该实现一个数组,就像你事后所说的那样,但谢谢