【问题标题】:How Can I Access A Constant Variable With Only A String如何仅使用字符串访问常量变量
【发布时间】:2019-07-07 20:52:58
【问题描述】:

我有以下问题:

const value1 = "some value";
var   value2 = "some value";

console.log(window["value1"]); // undefined
console.log(window["value2"]); // some value

我知道 const 是块作用域的,这就是我无法通过 window 对象访问它的原因。我的问题是,有没有办法只使用字符串标识符来访问 const 变量。

如果我只能访问“value1”,我如何获得实际 value1 的句柄?有没有可能?

【问题讨论】:

  • 我不确定是否可以为此使用 eval,但我宁愿不使用 eval。
  • 是的,你可以使用eval,是的,你不应该那样做。为什么不干脆做console.log(x == "value1" ? value1 : …)?为什么您甚至需要通过字符串访问局部变量,为什么不使用适当的数据结构(如Map 或对象)?
  • 如果你必须使用字符串来访问这样的变量,为什么不直接使用对象呢? const constants = { value1: "some value" }; 然后你可以使用console.log(constants["value1"]) 获取它。
  • @HereticMonkey,这正是我所做的。我会暂时使用这个。我仍然很好奇它是否可能,但可能不是因为它是块范围的。这可能是一个草率的问题。

标签: javascript scope constants


【解决方案1】:

看起来像 let 和 const 这样的块范围声明并没有添加到全局对象中,这意味着您不能通过 window 的属性访问它们。

在 Stack Overflow 上查看这个相关问题:https://stackoverflow.com/a/28776236/10965456

eval 应该可以工作eval("values1"),以及函数构造函数new Function("return value1")(),尽管我不确定为什么这是必要的。如果您需要动态访问某些值,请改用数组、对象或映射。

【讨论】:

  • 嘿,那个 new Function("return value1")() 方法很不错。你知道它是否与eval非常相似?当然,这只是创建一个函数来返回常量变量,这可能效率不高。不过,这已经回答了我的问题。这是使用字符串访问块范围变量的另一种方法。
  • Function 构造函数在内容安全策略方面被认为是一种 eval 形式 - 并且有充分的理由 - 将未经处理的输入传递给它可能会导致任意代码执行。将脚本添加到 DOM 可以做同样的事情。
  • 在安全性和性能方面有关 eval 和 Function 的一些信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…!
  • @Frank Function 构造函数仅适用于全局 const/let 变量,不适用于局部块范围的变量。是的,它与eval 非常相似——不要使用它。
  • 我确实让它适用于全局范围内的 const 变量,但我认为我将使用像这样的对象:{ "value1":value1 } 我正在从 JSON 文件加载对象构造函数,所以我有它们以字符串格式。我只需要掌握实际的构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2015-10-30
相关资源
最近更新 更多