我知道在节点中,每个模块都获得一个局部范围,并且在一个模块中定义的变量不会转义到全局,除非显式导出。
我想知道的是当我在一个模块文件中声明一个变量时,这个变量定义的全局对象是什么?
var obj = {};
// In browser, this is defined on window.obj
// How about in the node?
有one statement global
是用作本地全局范围的对象,但是以下测试代码失败:
a = 1
console.log global.a
// undefined
那么模块的全局变量是什么?
答案 0 :(得分:1)
实际上节点中有一个全局对象;它简称为global
。您可以为其分配属性并像访问任何其他对象一样访问这些属性,您可以跨模块执行此操作。但是,直接访问它(一个模块中的global.foo=bar
,另一个模块中的baz=global.foo
)是唯一方式来访问它。非限定变量名称从不自动解析为其属性,例如,浏览器环境中的非限定变量名称将解析为window.somethingOrOther
。在节点中,每个模块在概念上都包含在一个立即函数调用中,因此非限定名称代表局部变量并具有模块级范围。
答案 1 :(得分:0)
再次编辑我只是准备得出结论,在Node模块中,无法获取对全局对象的引用。你真的不应该这样;我认为这就是模块机制的重点。您可以导入所需内容并导出所选内容。
在Node中是否有 一个全局对象是一个有趣的问题,我想。我知道在Rhino中肯定存在;从Java容器中提供给Rhino的代码没有隐式包装函数。通过Java ScriptEngine机制(可能来自“裸”Rhino中的Mozilla API),有一些方法可以将符号推送到全局上下文中,以使它们作为全局对象属性对JavaScript可见。
哇这很复杂在Node.js世界中,似乎有些事情正在发生变化。我上面写的内容对于Node 0.6.2来说是正确的,但是在0.9.0-pre版本中,我刚刚做了一个名为“global”的对象,其行为或多或少与浏览器中的全局对象相似。
您可以在全局范围内使用this
。如果你需要一个名字,你可以给它一个。
var global = this;
var obj = "Hi!";
global.obj = "Bye"; // sets "obj"
(某种程度上)常见的习惯用法是将代码包装在函数中,以保护全局命名空间。
(function( global ) {
// everything
})( this );
警告:我不是Node人,所以在这种文化中可能会出现一些新兴的习语。
编辑 - 我发现如果Node确实从函数中评估的文件中包装代码,并且 没有将this
传递给它来自全球背景,然后没有办法“找到”它,我不认为。如果你使用“use strict”(并且你应该),那没关系,因为无论如何你都不能真正搞乱全局背景。