我知道节点,每个模块得到一个局部范围的变量在一个模块内定义将无法逃脱全球除非明确出口。
我想知道的是,当我在一个模块文件中声明一个变量如下,你对这个定义的变量是全局对象?
var obj = {};
// In browser, this is defined on window.obj
// How about in the node?
有一个说法是global
是用作本地全局范围的对象,但是下面的测试代码失败:
a = 1
console.log global.a
// undefined
那么,什么是一个模块的全局变量?
其实也有在节点的全局对象; 它简单地称为global
。 您可以指定属性,并访问就像任何其他对象的那些属性,并且可以跨模块做。 然而,直接访问它( global.foo=bar
一个模块,在baz=global.foo
在另一个)是访问它的唯一途径。 不合格的变量名称不会自动解决它的性质,就是说,在浏览器环境中不合格的变量名可以解决的方式window.somethingOrOther
。 在节点,每个模块在概念上被包裹立即函数调用里面,所以不合格的名称代表的局部变量和有模块级范围。
再次编辑我正要准备的结论是,节点模块中,你不能得到全局对象的引用。 你真的不应该需要; 这就是模块机制的整点样-的,我想。 您导入您需要什么,出口你选择什么。
是否存在即使是在节点的全局对象是一个有趣的问题,我猜。 我知道,在犀牛,肯定是有; 有从Java容器输送到犀牛代码周围没有隐含的包装功能。 通过Java的ScriptEngine机制(大概是从Mozilla的的API在“裸”犀牛)有推符号融入全球范围内,使他们看到JavaScript作为全球对象属性的方法。
哇,这得到了很好复杂的事情似乎是在Node.js的世界移动。 我上面写的是为节点0.6.2正确的,但在0.9.0预编译我只是做了确实是有,其行为或多或少就像在浏览器中的全局对象称为“全球”的对象。
下面的东西,适用于浏览器和犀牛和其他内容一样,
你可以使用this
在全球范围内。 如果你需要一个名字,你可以给它一个。
var global = this;
var obj = "Hi!";
global.obj = "Bye"; // sets "obj"
A(有点)常见的成语是包装你的代码的功能,以保护全局命名空间。
(function( global ) {
// everything
})( this );
警告:我不是一个节点的人所以有可能在文化一些新兴的成语。
编辑 -它发生,我认为如果真的节点从文件中不缠绕代码它在功能评估,并没有通过this
把它从全球范围内,那么就没有办法去“找”吧,我不认为。 如果你使用“使用严格”(你应该),也不要紧,因为你不能真正与全球范围内的乱反正。