eval() 怎么了?

Whats up with eval()?

我已经看到很多关于 eval() 函数是如何邪恶的; HTML/JavaScript 编程不是一个明智的选择。我想使用一个函数,我可以在其中传递一个字符串以将其作为变量名读取,eval() 似乎就是这样做的,但我不想使用破坏性函数。

据我了解,eval() 的问题在于它可以将第三方输入读取为实际代码,这为恶意 activity 打开了一扇门。我有一个地图元素,它使用位置名称字符串来跟踪位置。我还为变量分配了大块文本,因此我可以轻松地提取当前位置的描述。这似乎是使用 eval 的可接受时间,因为我要传递的字符串将由代码的其他部分提供。这是一个公平的判断,还是我应该使用其他一些功能?

(移动我的评论作为答案)

一个简单的解决方法是将您有兴趣访问的任何变量保存在 javascript 对象(即 key-value 对)中,并通过索引访问它们。这个简单的用例不需要 eval.

From what I understand, the issue with eval() is that it can read third-party input as actual code, which opens a door for malicious activity.

这不是唯一的原因。有人可能会争辩说,按照今天的标准,JavaScript 代码的性能可以忽略不计。

但是,必须考虑到 eval() 实际上会调用 JavaScript 解释器,这比预先编写代码要慢得多。 ¹

I would like to use a function where I can pass in a string to have it read as a variable name, and eval() seems to do just that, but I don't want to use a destructive function.

这不保证使用 eval()。如评论中所述,您可以通过跟踪对象中的变量来实现此目的:

let vars = {}

vars["some_variable_name"] = "test"

const var_name = "some_variable_name"

console.log(vars[var_name]) // "test"

as the strings that I would be passing in would be provided by other parts of the code

可能是,但是如果将来该代码的某些部分确实处理 一些 用户输入怎么办?

我认为不值得性能损失和明显的安全风险。

将变量名用作字符串的一种简单方法是使用对象(在某些语言中称为字典或映射)

const stringToGrade = {
  "freshman": 9,
  "sophomore": 10,
  "junior": 11,
  "senior": 12,
};

document.querySelector("#btn").addEventListener("click",  () => {
  const asString = document.querySelector("#inp").value.toLowerCase();
  const grade = stringToGrade[asString];
  console.log(`Your grade number is ${grade}`);
});
<input id="inp" placeholder="Enter your grade level (freshman, sophomore, etc.)" />
<button id="btn">Submit</button>