动态命名的局部变量,用于加载模块

时间:2015-12-29 17:21:04

标签: javascript

有没有办法用动态名称设置局部变量(即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优化编译器,因为在优化时应该知道这些变量是什么以及它们是否有效。

1 个答案:

答案 0 :(得分:5)

在ES5中,如果没有eval并且在全局范围之外,window[varname]无法可靠地执行此操作。

ES2015模式匹配

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解决方法

ES5有一种解决方法,就是在函数中定义自己的“局部作用域”对象,然后像普通对象一样使用它。

实施例

function () {
    "use strict";
    var l = {};
    var a = "someletter";
    l[a] = "A";
    console.log(l.someletter);
}