我在 app.js
:
var G = {};
module.exports = G;
var DATA = G.DATA = 'DATA';
var F1 = G.F1 = function(val)
{
return val;
};
通过这种方式,我可以在对象G
下导出变量,同时可以直接写入DATA
不带G.
前缀的变量。
到目前为止一切顺利。
现在,我想在 app.js
中为test.js
运行测试:
var G = require('./app.js');
console.log(G.DATA); // -> DATA
这样做有效,但我也希望直接使用DATA
前缀G.
来编写console.log(DATA); // -> DATA
前缀var DATA = G.DATA;
当然,我可以这样做
每个变量(属性)导出和所需模块G
对象的 G
,但显然,手动将每个变量添加到测试文件以对应function
对象是一个繁琐的过程。
有没有办法自动完成?
到目前为止,我很痛苦,因为
JS var
将var
括在自己的范围内,因此理论上没有办法为每个对象属性提供一个辅助函数eval
。
感谢。
PS。我想避免任何VM
或{{1}}节点解决方案。我过去曾经尝试过,而且问题太多了。
答案 0 :(得分:6)
我可以为每个属性导出和所需的模块G对象分配局部变量,但显然,手动将每个变量添加到测试文件以对应G对象是一个繁琐的过程。
不,这就是应该如何运作的。您 - 只有您 - 负责模块范围中存在的局部变量。包含模块的“导出变量”中的任何更改都不会破坏您的代码。
访问导入模块的属性(使用自选名称)是可行的方法。这与Python的import app
或import app as g
完全相同。
如果您想要某些特定属性作为局部变量,您通常会手动选择它们,就像在Python的from app import DATA, F1
中一样。在JS中,您需要multiple var
statement,就像您在问题中显示的那样。但是,有一个名为destructuring assignment的语法功能可以使其更加流畅。您可以在JavaScript 1.7+ (Gecko),CoffeeScript或EcmaScript 6:
var {DATA, F1} = require("app.js");
有没有办法自动完成?
是和否。你不应该这样做,但你可以 - 就像Python的皱眉from app import *
一样。引用what they say,这同样适用于JavaScript:
[它]可能会在解释器中引入一组未知的名称 隐藏你已定义的一些东西。
请注意,一般来说,从模块或导入
*
的做法 包裹是不受欢迎的,因为它经常会导致代码难以理解。 但是,可以使用它来保存交互式会话中的输入。
在JavaScript中,您可以 [1] use the with
-statement:
with (require("app.js")) {
…
}
[1]:Not in ES5.1 strict mode,但建议用于优化