【问题标题】:Should I use eval() to make variable declaration dynamic?我应该使用 eval() 使变量声明动态化吗?
【发布时间】:2020-06-24 07:00:59
【问题描述】:

我需要声明一些变量。如果我将变量名传递给函数,它应该声明所有变量。 (变量可能用于实例化对象。)

【问题讨论】:

  • eval 是邪恶的。从不使用
  • 你有它的用例吗?
  • 不要使用它。文档字面上说永远不要使用它。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…!
  • 为什么需要使变量名动态化?为什么变量名甚至很重要?当您的代码被修改时,变量名称无论如何都会更改为单个字母。
  • "我需要声明一些变量。" 然后声明它们。 “如果我将变量名传递给函数,它应该声明所有变量。”改为传递一个对象。否则,该函数与调用它的方式完全耦合。如果您有function myFunction(varName) { /* dynamically create a variable from varName */ console.log(foo)} 并希望它仅适用于myFunction("foo"),那么动态创建完全没用。你不能打电话给myFunction("bar"),因为这会导致错误。 only 允许的变量名是您所期望的。为什么不直接声明它们?

标签: javascript reactjs


【解决方案1】:

简答——你不应该

长答案。

这是一个不好的方法,因为 eval 是一个非常危险的东西。您可以在此处阅读有关问题的信息 — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

此外,它还可能导致您的应用程序设计不佳。尝试用其他解决方案替换动态变量名称。例如,对象属性。

让我们看一下代码示例:

function createObject(fieldName, value) {
  return {
    [fieldName]: value
  }
}

在这段代码中,我们没有使用 eval,而是使用带有动态键的对象。

【讨论】:

    【解决方案2】:

    您可以使用方括号动态声明变量而无需 eval:

    var variableName = 'someVariable';
    
    someObject[variableName] = 'some value';
    

    【讨论】:

    • 这不是变量声明,它是一个对象属性。
    • 是的,但是全局变量不是窗口对象的属性吗?尽管如此,该示例可能实际上很有用。
    • 一个全局的var声明变量被添加到全局对象中,是的,但是letconst变量并没有被添加到全局对象中,它们只存在于全局空间中。因此,混淆属性和变量的概念可能会产生问题,因为它们并不相同,而且并不总是以相同的方式工作。
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多