我有变量app.js:
var G = {};
module.exports = G;
var DATA = G.DATA = 'DATA';
var F1 = G.F1?= function(val)
{
return val;
};
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以在对象下导出变量G,同时可以直接访问变量DATA而无需G.前缀.
到现在为止还挺好.
现在,我想运行一个测试了app.js在test.js:
var G = require('./app.js');
console.log(G.DATA); // -> DATA
Run Code Online (Sandbox Code Playgroud)
这有效,但我也想直接写入DATA没有G.前缀的变量console.log(DATA); // -> DATA
当然,我可以做到
var DATA = G.DATA;对于每个变量(属性)导出和所需的模块G对象,但显然,手动将每个变量添加到测试文件以对应G对象是一个繁琐的过程.
有没有办法自动完成?
到目前为止,我从此感到悲观
JS function包含var在自己的范围内,因此理论上没有办法var为每个对象属性提供辅助函数.
谢谢.
PS.我想,以避免任何eval或VM节点的解决方案.我过去曾经尝试过,而且问题太多了.
我可以为每个属性导出和所需的模块G对象分配局部变量,但显然,手动将每个变量添加到测试文件以对应G对象是一个繁琐的过程.
不,这就是应该如何运作的.您 - 只有您 - 负责模块范围中存在的局部变量.包含模块的"导出变量"中的任何更改都不会破坏您的代码.
访问导入模块的属性(使用自选名称)是可行的方法.这完全等同于Python import app或import app as g.
如果你想要一些特定的属性作为局部变量,你通常会手动选择它们,就像在Python中一样from app import DATA, F1.在JS中,您需要一个多个var语句,就像您在问题中显示的语句一样.但是,有一种称为解构赋值的语法功能,这将使其更加流畅.您可以在JavaScript 1.7+(Gecko),CoffeeScript或EcmaScript 6中使用它:
var {DATA, F1} = require("app.js");
Run Code Online (Sandbox Code Playgroud)
有没有办法自动完成?
是和否.你不应该这样做,但你可以 - 就像Python的皱眉头一样from app import *.引用他们所说的内容,这同样适用于JavaScript:
[它]在解释器中引入了一组未知的名称,可能隐藏了你已经定义的一些东西.
请注意,一般来说,
*从模块或包导入的做法是不受欢迎的,因为它通常会导致代码难以理解.但是,可以使用它来保存交互式会话中的输入.
在JavaScript中,您可以[1] 使用with-statement:
with (require("app.js")) {
…
}
Run Code Online (Sandbox Code Playgroud)
[1]:不是在ES5.1 严格模式下 - 建议用于优化
| 归档时间: |
|
| 查看次数: |
1636 次 |
| 最近记录: |