首先,进入node REPL:

  1. mesogene@mesogene-team:~$ node
  2. >

查看global对象,发现其他全局对象(包括Buffer、require对象)以及全局方法都包含在global对象接口中

  1. > console.log(global);
  2. { global: [Circular],
  3. process:
  4. { title: 'node',
  5. version: 'v0.12.1',
  6. moduleLoadList:
  7. [ 'Binding contextify',
  8. 'Binding natives',
  9. ......
  10. require:
  11. { [Function: require]
  12. resolve: [Function],
  13. main: undefined,
  14. extensions:
  15. { '.js': [Function],
  16. '.json': [Function],
  17. '.node': [Function: dlopen] },
  18. registerExtension: [Function],
  19. cache: {} },
  20. _: undefined }
  21. undefined
  22. >

定义一个变量:test = 'define a val';

  1. > var test = 'define a val';
  2. undefined

再次查看global对象,你可以看到定义的变量test已经成为一个global对象的属性,并且出现在输出信息的底部:

  1. > console.log(global);
  2. { global: [Circular],
  3. process:
  4. { title: 'node',
  5. version: 'v0.12.1',
  6. moduleLoadList:
  7. [ 'Binding contextify',
  8. 'Binding natives',
         ......
  9. require:
  10. { [Function: require]
  11. resolve: [Function],
  12. main: undefined,
  13. extensions:
  14. { '.js': [Function],
  15. '.json': [Function],
  16. '.node': [Function: dlopen] },
  17. registerExtension: [Function],
  18. cache: {} },
  19. test: 'define a val',
  20. _: undefined }
  21. undefined

当我们通过在REPL中直接键入:gl = global查看global时我们发现:gl变量变为‘Circular refernce’

  1. > gl = global
  2. { global: [Circular],
  3. process:
  4. { title: 'node',
  5. version: 'v0.12.1',
  6. ......
  7. gl: [Circular],
  8. _: [Circular] }
  9. >

通常,当我们谈及context上下文是,一般指的是global对象。

应用:模块存在与自己的命名空间,这意味着,如果你在一个模块中定义一个全局(顶层)变量,它是不能被其他模块使用(也就是说,你不能在应用程序或其他模块中访问另一个模块的全局(顶层)变量)。只有那些被模块显式导出的部分才能被引用该模块的应用程序所使用。即调用模块对外提供的方法是访问模块内数据的唯一途径。

示例:在mod.js中定义一个模块,模块中定义一个全局变量globalVariables,以及对该变量进行设置和读取的函数(在读取函数中,我们使用console.log()方法将全局对象的内容打印出来)。

  mod.js代码如下:

  1. var globalVariables;
  2. exports.setGlobal = function(val){
  3. globalVariables = val;
  4. };
  5. exports.returnGlobal = function(){
  6. console.log(global);
  7. return globalVariables;
  8. };

  如果在另一个模块中可以访问该模块的全局变量globalVariables,那么我们在打印出的global对象中应该包含我们为其所设置的值。但事实并非如此:

  我们在REPL中加载mod.js模块:

  1. > var mod1 = require('./mod1.js');
  2. undefined
  3. > mod1.setGlobal();
  4. undefined
  5. > var val = mod1.returnGlobal();
  6. { global: [Circular],
  7. process:
  8. { title: 'node',
  9. version: 'v0.12.
  10. ......
  11. '/node_modules' ] },
  12. 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。

  1. > console.log(global);
  2. { global: [Circular],
  3. process:
  4. { title: 'node',
  5. version: 'v0.12.1',
  6. ......
  7. '/node_modules' ] },
  8. require:
  9. { [Function: require]
  10. resolve: [Function],
  11. main: undefined,
  12. extensions:
  13. { '.js': [Function],
  14. '.json': [Function],
  15. '.node': [Function: dlopen] },
  16. registerExtension: [Function],
  17. cache: { '/home/mesogene/nodejs-workspace/03global/mod1.js': [Object] } },
  18. mod1: { setGlobal: [Function], returnGlobal: [Function] },
  19. _: undefined,
  20. val: }
  21. undefined
  22. >

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

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

  1. var globalVariables;
  2. exports.setGlobal = function(val){
  3. globalVariables = val;
  4. globalValue = val;
  5. };
  6. exports.returnGlobal = function(){
  7. console.log(global);
  8. return globalVariables;
  9. };

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. AIX-vi操作-提示Unknown terminal type的问题解决方法

    AIX-vi操作-提示Unknown terminal type的问题解决方法AIX Version 5.3$ vi /etc/profilelinux: Unknown terminal type[ ...

  2. Eclipse MyEclipse 复制项目 复制现有项目 复制功能相似项目

    如果现在已经存在一个Java Web项目 ProjectA,现在想做另外一个项目,里面绝大部分功能和结构都可以复用,如果想通过复制的方法来,那么可以这么做: 1.到资源管理器中,将ProjectA文件 ...

  3. C++程序设计实践指导1.5求两个整数集合并集改写要求实现

    改写要求1:改写为单链表结构可以对任意长度整数集合求并集 #include <cstdlib> #include <iostream> using namespace std; ...

  4. (原+转)C++中的const修饰符

    const int a; int const a; 这两个写法是等同的,表示a是一个int常量. 简记:const后面是什么就限定什么(因为C++标准规定,const关键字放在类型或变量名之前等价的) ...

  5. PHP搭建(windows64+apache2.4.7+mysql-5.6+php5.5)

    现在大部分一键安装包多是32位的,并不支持64位,直接在64位的系统上使用会报错的,所以我这里就来说说windows 64位系统如何建立Apache+PHP+MySQL环境的! 我这里演示用的wind ...

  6. C语言--关键字、标识(zhi)符、注释

    一.关键字 1. 关键字 是C语言中提供的有特殊含义的符号,同时也叫做保留字,在C语言中关键字一共有32个,它们分别被赋予了特殊的含义.如:main.int.struct等等. 2. 关键字的特征 1 ...

  7. mysql tee 命令

    tee 命令说明: 用过mysql的应该都会知道mysql有一个叫show 的命令,这个命令应该是SQL标准之外的一个扩展:和这个类似mysql还扩展了一个叫tee的命令. tee的功能是把你的所有输 ...

  8. C# 动态语言特性,dynamic 关键字研究

    1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...

  9. Android常用代码

    1.图片旋转 Bitmap bitmapOrg = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable. ...

  10. 【C++】大数的+-*/四则运算

    所谓大数,则指数值特别大的数,可能会有99位,100位,远远超过了long long表示的范围. 这样的数作四则运算,需要用到字符串.用字符串通过每一位的字符的四则运算来模拟. 废话少说,上代码: # ...