有没有办法用动态名称设置局部变量(即var x = 1
),就像我们可以用于对象属性(即o["prefix:" + x]
)?
例如,我有一个CommonJS模块,并将多个组件加载到单独的局部变量中,以方便访问:
var module = require("module") // returns object like {a, b, c}
var a = module.a;
var b = module.b;
var c = module.c;
我希望能够在一行中完成此操作 - 为每个模块的属性设置局部变量。
这样做的一种方式是:
Object.assign(local_variable_object, require("module"));
其中local_variable_object
是一个以键作为变量名的对象。如果我只想导入部分模块,我可以对require()
的结果应用过滤功能。
我意识到我可能会使用eval
,但这会不必要地杀死V8优化编译器,因为在优化时应该知道这些变量是什么以及它们是否有效。
答案 0 :(得分:5)
在ES5中,如果没有eval
并且在全局范围之外,window[varname]
无法可靠地执行此操作。
ES6将pattern matching添加到允许您执行destructuring assignments的语言中。
var { a, b, c } = require("module");
等同于您的初始示例(以及Babel的ES2015-destructuring插件如何将其转换为ES5):
var module = require("module");
var a = module.a;
var b = module.b;
var c = module.c;
ES5有一种解决方法,就是在函数中定义自己的“局部作用域”对象,然后像普通对象一样使用它。
function () {
"use strict";
var l = {};
var a = "someletter";
l[a] = "A";
console.log(l.someletter);
}