在Node.js中的“全局”对象

9

我正在使用0.3.1-pre版本的Node.js

执行以下操作:

typeof global.parseInt

导致
'undefined'

然而,在控制台中键入“global.”后按[Tab]会列出函数列表,包括parseInt。

那么,parseInt是全局命名空间的成员吗?


为什么不直接使用 typeof parseInt?这对我很有效。 - jwueller
是的,确实如此。我只想知道这种特殊性的原因是什么。 - Art
4个回答

14

截至NodeJS v0.8.14版本,全局变量似乎可以跨模块工作,就像浏览器中的window对象一样。

测试:

a.js:

a1 = console.log;  // Will be accessed from b.js
global.a2 = console.log;  // Will be accessed from b.js

require('./b.js');

b1('a: b1');
b2('a: b2');
global.b1('a: global.b1');
global.b2('a: global.b2');

b.js:

a1('b: a1');
a2('b: a2');
global.a1('b: global.a1');
global.a2('b: global.a2');

b1 = console.log;  // Will be accessed from a.js
global.b2 = console.log;  // Will be accessed from a.js

运行a.js输出:

b: a1
b: a2
b: global.a1
b: global.a2
a: b1
a: b2
a: global.b1
a: global.b2

11

显然,global对象不像浏览器中的window那样是全局对象。据micheil在 #nodejs @ freenode 中说,它只是在内部使用。似乎与全局闭包有关等等。

parseIntsetTimeout以及它们的所有同伴都是自己的全局变量。它们不属于任何可见的全局对象。


这是否意味着装饰全局对象并不能真正使其在模块外可访问,或者它将可访问,但只能作为全局对象的属性在其他模块中使用? - Radagast the Brown
3
无论你对全局对象做了什么,它都可能在任何时候被清空。每当内部节点处理需要使用它时,它都会被重置。因此,它对于任何持久化的全局变量都是不可靠的。事实上,我只看到它在node-repl(命令行)中工作了半秒以上的时间。 - Tor Valamo
1
谢谢您的评论。这太令人难过了:(,特别是当许多人在许多地方将您引导到全局对象时。 - Radagast the Brown
2
我看到他们更新了 global 的文档(关于它实际上是做什么的一直有点混淆)。现在它确实包含了您设置的“全局”变量(在任何函数范围之外),但是每个模块都有一个新的全局对象,因此它不跨模块。在 index.js 中的 var a = 1 只能在 index.js 中作为 global.a 使用。 - Tor Valamo

9

app.js中定义变量时,如果不加上var关键字,例如myvar='someval',这将使得该变量在项目中的每个.js文件中都可见。


1
这是对问题的直接回答吗?我不这么认为。 - itsbruce
2
这是对问题背后可能的意图或其他人来到这里的意图的回答。就像任何答案应该做的那样。谢谢bFunc。 - zupa

0

失败:

if( global[ some_object_i_want_to_exist ] ){ ... }

工作

//: outside of all functions, including IIFE.
const THE_GLOBAL_YOU_PROBABLY_WANT_IS_THIS=( this );

//: Within a function:
const G = THE_GLOBAL_YOU_PROBABLY_WANT_IS_THIS;
if( G[ some_object_i_want_to_exist ] ){ ... }

我假设你来到了这个关于node.js中“global”的页面,是因为你想要相当于“window”的东西来检查全局声明的变量。bFunc的解决方案对我不起作用,因为它似乎需要明确地执行类似以下的操作:
global.some_object_i_want_to_exist = whatever;

在使用之前的先决条件

global[ some_object_i_want_to_exist ]

编辑:看着我的代码,似乎我解决问题的唯一原因是因为我在文件中的其他地方使用了“exports.some_object_i_want_to_exist”。如果没有那个,我的解决方案就会失败。所以...我不知道如何可靠地确定一个对象是否存在于Node.js中给定的范围内。

这里是全局对象的文档: https://nodejs.org/api/globals.html

我将保留我的答案,因为我听说人们更有可能在你错误时纠正你,所以也许有人会纠正我并给出问题的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接