Javascript 通过字符串–;除了评估之外还有别的吗? 请考虑这个片段: let variableName = 'internalVariable'; { let internalVariable = 'whatever'; console.log(eval(propertyKey)); // prints 'whatever' }

Javascript 通过字符串–;除了评估之外还有别的吗? 请考虑这个片段: let variableName = 'internalVariable'; { let internalVariable = 'whatever'; console.log(eval(propertyKey)); // prints 'whatever' },javascript,scope,eval,Javascript,Scope,Eval,通过variableName中存储的字符串访问internalVariable有哪些选项?我本来希望得到类似于scope[variableName]的东西,但似乎没有类似的东西 在这种特定的情况下,是否有其他方法可以替代使用eval?在需要动态访问变量之类的内容的情况下,惯用的做法是使用对象并根据需要动态计算属性名 var obj = {}; obj[getPropertyName()] = "hello world"; 在带有var、let或const的函数中声明的变量确实作为对象的属性存

通过
variableName
中存储的字符串访问
internalVariable
有哪些选项?我本来希望得到类似于
scope[variableName]
的东西,但似乎没有类似的东西


在这种特定的情况下,是否有其他方法可以替代使用
eval

在需要动态访问变量之类的内容的情况下,惯用的做法是使用对象并根据需要动态计算属性名

var obj = {};

obj[getPropertyName()] = "hello world";
在带有
var
let
const
的函数中声明的变量确实作为对象的属性存在(函数调用的结束),但JavaScript不提供任何将该对象称为对象的方法。使用
eval()
是可能的,但通常这是一个坏主意,因为在现代运行时系统中没有尝试运行时优化,因为
eval()
使其变得复杂

JavaScript中变量别名的唯一方式是通过
参数
对象,这非常奇怪,在“严格”模式下显式禁止使用


[编辑]-在下面的re:Bergi评论中,(通常不推荐)
with
语句允许隐式引用对象属性,模块的
export
机制可以创建别名,虽然对我来说,很难想象在实际操作中这是一件好事。

你为什么要这么做?你总是可以使用一个对象和
[]
动态引用属性。这应该用一个对象
{internalProperty:“whatever”}
来处理,而不是一个命名变量。@panepeter不,这是不可能的。“不呈现真实世界的使用情况”…那么我们就无法呈现真实世界的解决方案。另外:
使用
和ES6模块exports@Bergi我相信你是对的,但我不确定我是否完全理解你的意思。它指的是“变量别名的唯一方式”“,但当然,上述三种机制都无助于访问局部作用域(甚至是
let
-声明,如问题示例中所述)变量。@Bergi我从未想过使用
import
将同一导出值绑定到多个符号的后果;这看起来像是一个错误向量。考虑到所有别名都是不可变的引用,我看不出有什么问题。这比当前引用共享模块对象属性的做法要好得多。