通过字符串访问局部范围的变量——除了 eval?
Access to locally scoped variable via string – anything but eval?
请考虑这个片段:
let variableName = 'internalVariable';
{
let internalVariable = 'whatever';
console.log(eval(propertyKey)); // prints 'whatever'
}
通过 variableName
中存储的字符串访问 internalVariable
我有哪些选择?我希望有 scope[variableName]
之类的东西,但似乎没有。
鉴于这种特殊情况,是否有使用 eval
的替代方法?
在需要动态访问如变量的情况下,惯用的做法是使用一个对象并根据需要动态计算属性名称。
var obj = {};
obj[getPropertyName()] = "hello world";
在带有 var
、let
或 const
的函数中声明的变量确实作为对象之类的属性存在(函数调用的闭包),但是 JavaScript 不提供任何将那个东西称为对象的方法。使用 eval()
是可能的,但通常这是一个坏主意,因为在现代运行时系统中不会尝试运行时优化,因为 eval()
使它变得非常复杂。
变量在 JavaScript 中别名的唯一方法是通过 arguments
对象,这很奇怪,在 "strict" 模式下明确不鼓励这样做。
[edit] — 在 re: Bergi 下面的评论中,(通常不推荐使用的)with
语句允许隐式引用对象属性,并且模块的 export
机制可以创建别名,尽管我很难想象在实际实践中是一件好事。
请考虑这个片段:
let variableName = 'internalVariable';
{
let internalVariable = 'whatever';
console.log(eval(propertyKey)); // prints 'whatever'
}
通过 variableName
中存储的字符串访问 internalVariable
我有哪些选择?我希望有 scope[variableName]
之类的东西,但似乎没有。
鉴于这种特殊情况,是否有使用 eval
的替代方法?
在需要动态访问如变量的情况下,惯用的做法是使用一个对象并根据需要动态计算属性名称。
var obj = {};
obj[getPropertyName()] = "hello world";
在带有 var
、let
或 const
的函数中声明的变量确实作为对象之类的属性存在(函数调用的闭包),但是 JavaScript 不提供任何将那个东西称为对象的方法。使用 eval()
是可能的,但通常这是一个坏主意,因为在现代运行时系统中不会尝试运行时优化,因为 eval()
使它变得非常复杂。
变量在 JavaScript 中别名的唯一方法是通过 arguments
对象,这很奇怪,在 "strict" 模式下明确不鼓励这样做。
[edit] — 在 re: Bergi 下面的评论中,(通常不推荐使用的)with
语句允许隐式引用对象属性,并且模块的 export
机制可以创建别名,尽管我很难想象在实际实践中是一件好事。