我正在尝试对使用JavaScript库的代码进行单元测试,该JavaScript库设置了全局变量(如果不存在)。 库使用的模式是:

var GLOBAL_VAR = GLOBAL_VAR || {}

这在浏览器世界中有效,但是当我在NodeJS中执行代码时,它不起作用。 问题归结为:

var myGlobal = 'CORRECT';
console.log('Prints CORRECT', myGlobal || 'WRONG');
(function () {
  // Why does this print WRONG?
  var myGlobal = myGlobal || 'WRONG';
  console.log('Prints WRONG', myGlobal);
}).call(this);

(function () {
  console.log('Prints CORRECT', myGlobal || 'WRONG');
}).call(this);

为什么第一个功能打印错误,而第二个功能打印正确?

#1楼 票数:2 已采纳

您正在第一个匿名函数中声明局部变量myGlobal 这遮盖了全局变量。

然后,在匿名函数中,声明:

var myGlobal = myGlobal || 'WRONG';
//             ^
//             |  this local variable is undefined here, as
//                the global is not accessible with this name

这就是为什么myGlobal (局部变量)获得值'WRONG'

解决方案是将匿名函数中名称混乱的局部变量myGlobal重命名为myGlobal全局变量的变量。

请注意,如果使用let as let不允许将变量用作其自己的声明中的值,则不会有此问题:

let x = x || 'WRONG'; // should produce an error and leave x undefined.

  ask by enl8enmentnow translate from so

未解决问题?本站智能推荐:

1回复

Nodejs 全局变量

我在 node.js 服务器端代码(通过表单提交访问)的 post 路由中有一个名为username的变量,我想在另一个 post 路由中使用这个相同的变量。 有什么办法可以做到这一点吗?
1回复

在NodeJS中使用和更新全局变量是否安全?

我有一个节点服务器,用于加载任何人都可以编写的脚本。 据我所知,当我启动Node服务器时,模块首次在全局范围内加载。 当一个人请求一个页面时,它会被“启动服务器”回调加载; 我可以根据请求使用所有已加载的模块。 但我没有遇到过一个脚本,其中全局变量在请求时间内发生了变化,并且影响了流程中
1回复

如何在NodeJS中的回调函数中设置全局变量的值[重复]

这个问题在这里已经有了答案: 如何从异步调用返回响应(43 个回答) 上个月关闭。 我正在尝试在全局变量结果中设
3回复

如何声明和访问全局变量

我在下面的代码中做错了什么? 当我执行File2.js时,我对arr []的定义未定义。 有人可以帮我我在下面的代码中做什么
2回复

在函数内初始化一个 nodejs 全局变量并让它等同于在外部调用它

所以当涉及到 nodejs 时,我在范围方面遇到了一些问题。 我想知道如何在全局空间中初始化一个变量,在一个函数(私有范围)中初始化它,然后当你在类中的任何地方调用它时,让它等于你在私有范围中初始化它的内容。 我注意到的一件事是,尽管您可以在私有范围内使用该变量,但在该函数外再次调用它时,它只会变为
1回复

在express / node中使用全局变量

试图找到解决方案,我找到了4个解决方案,但我想知道哪个是更好/最佳实践。 为什么! :P 1.使用req.app.get() 2.使用req.app.settings(类似于上面) 3.导出app对象,这样我就可以访问没有req对象的app.get() 4.使用
1回复

如何使用should.js作为全局变量:

我试图使用mocha和should.js编写一些单元测试,因为我想保持每个单元测试的格式相同,并且每个单元测试都需要should.js来验证对象的属性。 我如何才能使其成为全局变量,所以到目前为止,我已经尝试过在每个测试文件上都不需要require.js 如果我用这个。 有用
2回复

如何动态访问Node中的全局变量?

在基于浏览器的JavaScript中,您可以执行以下操作: 有没有办法在缺少window对象的Node中做类似的事情?