Nodejs随笔(三):全局对象之global
首先,进入node REPL:
mesogene@mesogene-team:~$ node
>
查看global对象,发现其他全局对象(包括Buffer、require对象)以及全局方法都包含在global对象接口中:
> console.log(global); { global: [Circular], process: { title: 'node', version: 'v0.12.1', moduleLoadList: [ 'Binding contextify', 'Binding natives', ...... require: { [Function: require] resolve: [Function], main: undefined, extensions: { '.js': [Function], '.json': [Function], '.node': [Function: dlopen] }, registerExtension: [Function], cache: {} }, _: undefined } undefined >
定义一个变量:test = 'define a val';
> var test = 'define a val'; undefined
再次查看global对象,你可以看到定义的变量test已经成为一个global对象的属性,并且出现在输出信息的底部:
> console.log(global); { global: [Circular], process: { title: 'node', version: 'v0.12.1', moduleLoadList: [ 'Binding contextify', 'Binding natives',
...... require: { [Function: require] resolve: [Function], main: undefined, extensions: { '.js': [Function], '.json': [Function], '.node': [Function: dlopen] }, registerExtension: [Function], cache: {} }, test: 'define a val', _: undefined } undefined
当我们通过在REPL中直接键入:gl = global查看global时我们发现:gl变量变为‘Circular refernce’
> gl = global { global: [Circular], process: { title: 'node', version: 'v0.12.1', ...... gl: [Circular], _: [Circular] } >
通常,当我们谈及context上下文是,一般指的是global对象。
应用:模块存在与自己的命名空间,这意味着,如果你在一个模块中定义一个全局(顶层)变量,它是不能被其他模块使用(也就是说,你不能在应用程序或其他模块中访问另一个模块的全局(顶层)变量)。只有那些被模块显式导出的部分才能被引用该模块的应用程序所使用。即调用模块对外提供的方法是访问模块内数据的唯一途径。
示例:在mod.js中定义一个模块,模块中定义一个全局变量globalVariables,以及对该变量进行设置和读取的函数(在读取函数中,我们使用console.log()方法将全局对象的内容打印出来)。
mod.js代码如下:
var globalVariables; exports.setGlobal = function(val){ globalVariables = val; }; exports.returnGlobal = function(){ console.log(global); return globalVariables; };
如果在另一个模块中可以访问该模块的全局变量globalVariables,那么我们在打印出的global对象中应该包含我们为其所设置的值。但事实并非如此:
我们在REPL中加载mod.js模块:
> var mod1 = require('./mod1.js'); undefined > mod1.setGlobal(34); undefined > var val = mod1.returnGlobal(); { global: [Circular], process: { title: 'node', version: 'v0.12. ...... '/node_modules' ] }, require:
{ [Function: require]
resolve: [Function],
main: undefined,
extensions:
{ '.js': [Function],
'.json': [Function],
'.node': [Function: dlopen] },
registerExtension: [Function],
cache: { '/home/mesogene/nodejs-workspace/03global/mod1.js': [Object] } },
mod1: { setGlobal: [Function], returnGlobal: [Function] },
_: undefined,
val: undefined }
undefined
在返回globalVariables变量值之前,console.log方法先输出了global对象的内容,而且我们可以发现:在输出信息的最后部分包含了被引用模块的信息,但是输出的信息中没有包含任何关于全局变量globalVariables的信息。val变量的值是不确定的,因为该变量尚未设置(如上述代码蓝底白子所示)。如果我们在运行一次console.log(global),我们将会看到val的值是34。
> console.log(global); { global: [Circular], process: { title: 'node', version: 'v0.12.1', ...... '/node_modules' ] }, require: { [Function: require] resolve: [Function], main: undefined, extensions: { '.js': [Function], '.json': [Function], '.node': [Function: dlopen] }, registerExtension: [Function], cache: { '/home/mesogene/nodejs-workspace/03global/mod1.js': [Object] } }, mod1: { setGlobal: [Function], returnGlobal: [Function] }, _: undefined, val: 34 } undefined >
再强调一遍:调用模块对外提供的方法是访问模块内数据的唯一途径。
备注:如果在mod.js模块,代码是下面这个样子,那么global中必定包含globalValue:34的信息。
var globalVariables; exports.setGlobal = function(val){ globalVariables = val; globalValue = val; }; exports.returnGlobal = function(){ console.log(global); return globalVariables; };