我在中有变量 app.js :
app.js
var G = {}; module.exports = G; var DATA = G.DATA = 'DATA'; var F1 = G.F1 = function(val) { return val; };
通过这种方式,我可以导出对象下的变量G,同时可以直接写入变量DATA而无需G.前缀。
G
DATA
G.
到目前为止,一切都很好。
现在,我想运行一个 测试 了app.js在 test.js :
test.js
var G = require('./app.js'); console.log(G.DATA); // -> DATA
这可行,但我也想直接写DATA没有G.前缀的变量来访问变量,例如console.log(DATA); // -> DATA
console.log(DATA); // -> DATA
当然可以
var DATA = G.DATA;对于每个变量(属性)导出和需要的模块G对象,但是显然将每个变量手动添加到测试文件以对应G对象是一个繁琐的过程。
var DATA = G.DATA;
有什么办法可以自动执行此操作?
到目前为止,我很悲观
JS function包含var在自己的范围内,因此从理论上讲,没有办法var为每个对象属性都提供一个辅助函数。
function
var
谢谢。
PS。我想避免任何eval或VM节点解决方案。我过去曾经尝试过,但问题太多了。
eval
VM
我可以为每个属性导出和必需的模块G对象分配一个局部变量,但是显然,将每个变量手动添加到测试文件以对应G对象是一个繁琐的过程。
不,这就是应该的工作方式。您-并且只有您-负责模块范围中存在哪些局部变量。所包含模块的“导出变量”中的任何更改均不应破坏您的代码。
访问导入模块上的属性(具有自选名称)是一种方法。这与Python import app或相当import app as g。
import app
import app as g
如果您希望某些特殊属性作为局部变量,通常会像在Python中一样手动选择它们from app import DATA, F1。在JS中,您将需要多个var语句,就像您在问题中显示的那样。但是,有一种语法功能称为解构分配,这将使此操作更加流畅。您可以在JavaScript 1.7+(Gecko),CoffeeScript或EcmaScript 6中使用它:
from app import DATA, F1
var {DATA, F1} = require("app.js");
是的,不是。您 不应该这样 做,但是可以-就像Python的皱眉一样from app import *。引用他们说的话,对于JavaScript同样如此:
from app import *
[It]向解释器引入了一组未知的名称,可能会隐藏您已经定义的某些内容。 请注意,通常不赞成*从模块或包中进行导入,因为这通常会导致可读性差的代码。但是,可以使用它来保存交互式会话中的键入。
[It]向解释器引入了一组未知的名称,可能会隐藏您已经定义的某些内容。
请注意,通常不赞成*从模块或包中进行导入,因为这通常会导致可读性差的代码。但是,可以使用它来保存交互式会话中的键入。
*
with (require("app.js")) { … }