首先,进入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();
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: }
undefined
>

再强调一遍:调用模块对外提供的方法是访问模块内数据的唯一途径。

备注:如果在mod.js模块,代码是下面这个样子,那么global中必定包含globalValue:34的信息。

var globalVariables;
exports.setGlobal = function(val){
globalVariables = val;
globalValue = val;
};
exports.returnGlobal = function(){
console.log(global);
return globalVariables;
};

Nodejs随笔(三):全局对象之global的更多相关文章

  1. nodejs 全局变量和全局对象

    1.全局对象 所有模块都可以调用 1)global:表示Node所在的全局环境,类似于浏览器中的window对象. 2)process:指向Node内置的process模块,允许开发者与当前进程互动. ...

  2. NodeJS API Process全局对象

    Process 全局对象,可以在代码中的任何位置访问此对象,使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等 ...

  3. 【WXS全局对象】Global

    Global对象的方法调用时,无需使用 Global.parseInt(...),而是直接使用 parseInt(...) 方法: 名称 说明 parseInt(string, radix) 解析一个 ...

  4. nodejs 全局对象 global

    nodejs中有一个全局对象 global,所有的全局变量都是global对象的属性,glabal最根本的作用是作为全局变量的宿主, 全局变量: 1 在最外层定义的变量 2 全局对象的属性 3 隐式定 ...

  5. nodejs(三) --- nodejs进程与子进程

    嗯,对于node的学习还远远不够,这里先做一个简单的api的记录,后续深入学习. 第一部分:nodejs中的全局对象之process进程对象 在node中的全局对象是global,相当于浏览器中的wi ...

  6. Node.js:get/post请求、全局对象、工具模块

    一.GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交.表单提交到服务器一般都使用 GET/POST 请求. 1.获取GET请求内容 由于GET请求直接被嵌入在路径 ...

  7. 30.Node.js 全局对象

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html 学习要点: - __filename - __dirname - setTimeou ...

  8. Node.js 全局对象

    JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可 以在程序的任何地方访问,即全局变量. 在浏览器JavaScript 中,通常window 是全 ...

  9. JavaScript中两种类型的全局对象/函数

    这里所说的JavaScript指浏览器环境中的包括宿主环境在内的. 第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScri ...

随机推荐

  1. oracle ORA_ROWSCN 行记录的更新时间

    在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENC ...

  2. Vlc基础数据结构记录

    1.  Vlc基础数据结构 hongxianzhao@hotmail.com 1.1  基础数据结构 struct vlc_object_t,相关文件为src\misc\objects.c. 定义为: ...

  3. ng-class用法

    在angular中为我们提供了3种方案处理class: 1:scope变量绑定.这种方案不推荐,因为scope里最好处理业务逻辑,不去管渲染的事.2:字符串数组形式.3:对象key/value处理. ...

  4. 系统开发中按下Enter键登录系统

    转载来自:http://www.jb51.net/article/54308.htm 系统开发中按下Enter键登录系统,即就是监听键盘,当按下Enter键后调用登录按钮的click()事件. JS方 ...

  5. Crystal Report分組中的序號重新遞增

    客戶要批次列印發票,也就是報表需要按照發票號碼(INV_NO)進行分組,每個發票里還有明細的item,之前因為直接抓RecordNumber,所以該欄位只能從1開始計數,遇到新的發票發號不會重新從1開 ...

  6. opals 开发记录

    1:开发需要的文件 下载地址:http://www.geo.tuwien.ac.at/opals/html/index.html 注意只能在release下才能通过. 我自己整理好的(64位的),以备 ...

  7. YUM更换源--yum找不到安装包(转)

    公司提供的CentOS VM中,/etc/yum.repos.d 下 只有一个build.repo,其中提供的yum 源只有公司内部的几个源,很多包在这些源中都找不到.于是要添加别的源,下面的帖子中介 ...

  8. How Many Fibs?

    How Many Fibs? 点我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. C语言基础11

    函数指针的定义: 函数类型 (标识符 指针变量名)(形参列表) void  printHello( ); void printHello( ){ printf("hello world!!! ...

  10. FMDB用法

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...