首先,进入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. PropertyGrid—添加属性Tab

    零.引言 PropertyGrid用来显示和编辑对象的属性,前面已经简单介绍了如何使用该控件和提供不同的属性编辑方法.前面主要讲如何使用该控件,但有时,该控件无法满足我们的需求,就需要对其进行扩展.本 ...

  2. Ascll

    ascll - 概述 ASCII码(American Standard Code for Information Interchange, 美国标准信息交换码).   信息编码就是将表示信息的某种符号 ...

  3. MVC布局页占位符@RenderSection("bscript", false)

    @RenderSection("bscript", false) //false表示不是必须填充 填充bscript占位符  @section bscript{}

  4. 什么时候会刷新备库控制文件refresh the standby database control file?

    通过合理的设置,对于Primary的绝大数操作,都是可以传递到Physical Standby,datafile的操作是通过STANDBY_FILE_MANAGEMENT参数来控制的,但是即使STAN ...

  5. eclipse使用Git插件

    折腾了会Git,记录一下下. 1.安装Git  Help-->Install New Software  点击Add,Name随意,Location为http://download.eclips ...

  6. 世界国家名与英文名【json】

    英文版 var geolocation= [   ["AO", "Angola"],   ["AF", "Afghanistan& ...

  7. C#控制台程序本地化应用(Localization)

    本地化在百度百科上的解释如下: “软件本地化是指将某一产品的用户界面(UI)和辅助材料(文档资料和在线帮助菜单)从其原产国语言向另一种语言转化,使之适应某一外国语言和文化的过程.” 其原理主要是把相同 ...

  8. ORA-04092: COMMIT 不能在触发器中

    触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务 ...

  9. python虚拟环境Virtualenvwrapper无法升降级虚拟环境软件解决方法

    virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够在没有权限的情况下安装新套件,不同应用可以使用不同的套件版本,套件升级不影响其他应用. Virtaulen ...

  10. Oracle 11gR2 RAC 安装配置

    1. 简介   Oracle RAC,全称real application clusters,译为"实时应用集群", 是Oracle新版数据库中采用的一项新技术,是高可用性的一种, ...