首先,进入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. javascript 判断系统设备

    <script> function detectOS() { var sUserAgent = navigator.userAgent; var isWin = (navigator.pl ...

  2. mysql命令学习笔记(1):show table status like 'user';显示表的相关信息

    show table status like 'user';显示表的相关信息 +------------+--------+---------+------------+------+-------- ...

  3. 浅谈JavaScript DOM编程艺术读后感和一点总结

    最近工作不是很忙就想想想JavaScript的内部组成和一些要点,就是从这本书开始的.对新手来说还好,简单易懂. 简单终结下我重书中学到的一些要点. 下面都是个人学习的要点提取: 1.给自己预留退路, ...

  4. 清理SQL数据库日志

    Use DBSelect NAME,size From sys.database_files ALTER DATABASE DB SET RECOVERY SIMPLE WITH NO_WAIT AL ...

  5. Oracle11g客户端安装及plsql配置

    1,项目使用的是oracle11g数据库,安装个客户端访问服务器. 到oracle官方下载: http://www.oracle.com/technology/global/cn/software/t ...

  6. iOS开发之UIApplication

    UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作. iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示:  ...

  7. toj4119HDFS

    In HDFS( Hadoop Distributed File System), each data may have a lot of copies in case of data lose. T ...

  8. Qt 五子棋

    http://blog.csdn.net/baiding1123/article/details/17194535

  9. mysql数据备份和还原命令

    mysql数据库备份和还原   备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfil ...

  10. Router和History (路由控制)-backbone

    Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...