当前位置: 首页 > 面试题库 >

是否可以在JavaScript(node.js)中导入变量?

微生耘豪
2023-03-14
问题内容

我在中有变量 app.js

var G = {};
module.exports = G;

var DATA = G.DATA = 'DATA';
var F1 = G.F1 = function(val)
{
  return val;
};

通过这种方式,我可以导出对象下的变量G,同时可以直接写入变量DATA而无需G.前缀。

到目前为止,一切都很好。

现在,我想运行一个 测试app.jstest.js

var G = require('./app.js');
console.log(G.DATA);  // -> DATA

这可行,但我也想直接写DATA没有G.前缀的变量来访问变量,例如console.log(DATA); // -> DATA

当然可以

var DATA = G.DATA;对于每个变量(属性)导出和需要的模块G对象,但是显然将每个变量手动添加到测试文件以对应G对象是一个繁琐的过程。

有什么办法可以自动执行此操作?

到目前为止,我很悲观

JS function包含var在自己的范围内,因此从理论上讲,没有办法var为每个对象属性都提供一个辅助函数。

谢谢。

PS。我想避免任何evalVM节点解决方案。我过去曾经尝试过,但问题太多了。


问题答案:

我可以为每个属性导出和必需的模块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");

有什么办法可以自动执行此操作?

是的,不是。您 不应该这样 做,但是可以-就像Python的皱眉一样from app import *。引用他们说的话,对于JavaScript同样如此:

[It]向解释器引入了一组未知的名称,可能会隐藏您已经定义的某些内容。

请注意,通常不赞成*从模块或包中进行导入,因为这通常会导致可读性差的代码。但是,可以使用它来保存交互式会话中的键入。

with (require("app.js")) {
    …
}


 类似资料:
  • 问题内容: 我正在动态生成一个列表。我想使每行都悬停在鼠标悬停上并单击链接。我希望链接传递行内容的ID。 基本上: 问题出在js / jquery中。我希望能够抓住$ cid并在单击后将其传递给student.php页面。上面的php代码有效,但是js当然不会。我知道客户端语言和服务器端语言的基础。这个问题不值得上课。我知道我无法完全做到这一点,但这是我最终想要实现的目标。关于如何简单地实现此目标

  • 我想用Ansible复制大文件。目标服务器有一个具有足够存储空间的专用分区。我注意到ansible使用由remote_tmp变量定义的临时目录。 谢谢你的回答。

  • 本文向大家介绍是否可以在JavaScript执行中写入MongoDB控制台?,包括了是否可以在JavaScript执行中写入MongoDB控制台?的使用技巧和注意事项,需要的朋友参考一下 要在控制台上编写,您需要使用方法。语法如下- 要显示对象,可以使用。语法如下- 让我们实现这两个功能。第一个查询如下所示以显示某些内容- 以下是控制台上的输出- 让我们创建一个对象。查询如下- 这是显示上述对象“

  • 我有一些代码如下所示: 有没有办法从ScalaTest中模拟/存根,就像使用nodejs的proxyquire一样? 我读到我可以使用依赖注入,但我宁愿不这样做 我唯一的选择是传递我的lib作为类参数吗? 有什么建议可以让它更容易测试吗?谢啦 编辑: 泽维尔·吉奥特的回答是这个问题的一个有趣的方法,但是我选择改变代码来进行测试。 我将作为参数传递,并使用mockito进行模拟,这使代码比隐藏范围更

  • 问题内容: 给定两个值x和y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中可行吗? 问题答案: 不与原始类型(,,等)。Java按值传递东西,这意味着函数传递的变量是原始变量的副本,并且您对该副本所做的任何更改都不会影响原始变量。 现在,对象有所不同,因为对象变量的“值”实际上是对对象的引用-复制该引用使其指向完全相同的对象。 局限性在于,您仍然无法以调用者可以看到的任何方式

  • 我正在做一个项目,所有的团队成员都在使用Eclipse,而我是唯一的IDEA用户。这造成了大量进口重新安排的噪音。eclipse导入的顺序是:Java、Javax、Org、Com,按字母顺序排列。是否可以配置IDEA来遵循这些规则?