原文标题:Global Variables in Node.js

原文链接:http://www.hacksparrow.com/global-variables-in-node-js.html

你可能正在使用一些 Node.js 的模块,或者一个框架比如 Express.js ,并且突然感觉你需要创建一些全局变量。在 Node.js 中你会如何创建全局变量?

在这个问题上,大多数的建议是“不使用 var 声明变量”,或者是“把变量添加到 global 对象上”,亦或者是“将变量添加到 GLOBAL 对象上”。你选择哪一个?

首先,让我们来分析一下这个global 对象。打开一个终端,切换到 Node REPL (prompt)

$ node
>

输入"global",看看这个对象到底有些什么。

> global

我的天啊(原文:Holy mother of Flying Spaghetti Monster!!!)!这是一个庞大的对象!实际上,你看到了 Node.js 的灵魂。在一个 Node.js 的进程中,所有的其他对象都是依附在 global 对象上。如果你熟悉浏览器中的 JavaScript 环境,global 对象和 Window 对象相似。

现在我们知道了 global 对象是什么,现在让我们来玩弄它:

> global.name
undefined
> global.name = 'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> delete global.name
true
> GLOBAL.name
undefined
> name = 'El Capitan'
'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> var name = 'Sparrow'
undefined
> global.name

有趣的观察!(Interesting observations!)

看起来似乎 global 和 GLOBAL 是同一个东西。实际上,GLOBAL 是 global 的一个别名。

更让人惊讶的是:无论是使用 var 声明的变量还是未使用 var 声明的变量都添加到了 <codeglobal 对象>global 对象上。在 Node.js 中,不使用 var 关键字声明变量是一种创建全局变量的基本的方法。这种方法在模块中的实现稍微有些不同,接下来我会解释。

当你创建了一个 Node.js 进程,在这个进程中的所有模块都分享同一个 global 对象。结合上面的观察,你对 global 对象的工作方式有一定的理解。然而,有一点不同之处在于,在你创建的模块中,使用 var 关键字声明的变量只属于这个模块,属于局部变量。那些未使用 var 关键字声明的变量则附加到 global 对象上。

所以现在你知道了:“不使用 var 声明变量”,“把变量添加到 global 对象上”和“将变量添加到 GLOBAL 对象上”是相同的事情。

在模块中全局声明的变量可以通过它的变量名直接被任何其他的模块引用,而不用通过 global 对象的引用,意味着:

name == global.name == GLOBAL.name

但是这并不意味着你应该这么做。为什么?看看这个:

var company = 'Yahoo';
console.log(global.company); // 'Google'
console.log(company); // 'Yahoo'

当时使用 gloabal.campany ,你知道你在处理全局变量,此外,在模块中作为局部变量使用时节约了变量名 campany 。如果你打算在你的 Node.js 程序中使用全局变量,关于 global 对象的方法的讨论效果很好。但是,别过度使用全局变量。说了这么多,难道还有不使用全局变量的替代解决方法?

是的,有这么一个,并且它涉及到 module.exports 的使用。让我用一个例子来证明:

main.js 中的内容:

exports.company = 'Google';
var m = require('./mod');

mod.js 中的内容:

var company = require('./main').company;
console.log(company);

现在来看看它怎么运作的:

$ node main.js
Google

你拥有了一个变量,这个变量来自另一个没有使用全局对象的可使用的模块。你可以在其他的模块中引用 main.js 以此来使用 变量名 campany。

注意:引用一个已经引用了另外一个模块的模块,只会创建一个包含前一个模块的引用,这并不意味着会严重增加内存的使用。同时,因为不存在真正的重复包含,模块中所有的初始化函数都不会重复执行一次。

所以,结论是:在 Node.js 中有两种创建全局变量的方法,一种是使用 global 对象,另一种是使用 module.export 。我的建议是什么?小应用使用 global 对象,大型应用使用 module.export。

(完)

翻译水平有待提高,所翻译的博文并不是按照原文一句一句翻译,而是添加了自己对文章的理解。如有不正之处,欢迎指正!

个人笔记,仅供参考。

参考:

http://www.hacksparrow.com/global-variables-in-node-js.html

(译)Node.js的全局变量的更多相关文章

  1. [译]Node.js - Event Loop

    介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...

  2. 【node.js】全局变量、常用工具、文件系统

    学习链接:http://www.runoob.com/nodejs/nodejs-global-object.html 在 JavaScript 中,通常 window 是全局对象, 而 Node.j ...

  3. node.js的全局变量的注意

    在node.js中,如果一个变量没有用var来声明,就会变为全局变量: 看如下代码: 1)6.js function myadd(a) { return a+abc; } function conta ...

  4. [译]Node.js Interview Questions and Answers (2017 Edition)

    原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...

  5. 译\Node.js应用的持续部署

    Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...

  6. [译]Node.js : Building RESTful APIs using Loopback and MySQL

    国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...

  7. [译]Node.js Best Practices - Part 2

    原文: https://blog.risingstack.com/node-js-best-practices-part-2/ 统一风格 在大团队开发JS应用, 创建一个风格指南是很有必要的. 推荐看 ...

  8. [译]Node.js面试问与答

    原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...

  9. [译]Node.js Best Practices

    原文: http://blog.risingstack.com/node-js-best-practices/ 下面的的最佳实践分为代码风格和开发工作流两种. 代码风格 Callback约定 Modu ...

随机推荐

  1. 大家帮我测试下,IOCP服务端和客户端交互

    大家帮我测试下,主要是对游戏服务端的测试,这个客户端C#版本,需要NET4.0支持

  2. iOS开发的准备

    一.程序设计语言 上一讲已经说到:要想开发一款软件,首先得学习一些相应的程序设计语言.至于iOS开发,需要学习的语言主要有:C.C++.Objective-C. 二.是否需要计算机专业知识 可能很多人 ...

  3. (Problem 39)Integer right triangles

    If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exact ...

  4. 《转》使用JAVA如何对图片进行格式检查以及安全检查处理

    本文出自冯立彬的博客,原地址:http://www.fenglibin.com/use_java_to_check_images_type_and_security.html 一.通常情况下,验证一个 ...

  5. JSP与Servlet的中文乱码处理

    注:百度来的,改了改... jsp页面的的头要设置好 <%@ page language="java" contentType="text/html; charse ...

  6. ecshop删除商品函数

    /** * 从回收站删除多个商品 * @param mix $goods_id 商品id列表:可以逗号格开,也可以是数组 * @return void */ function delete_goods ...

  7. centos 磁盘扩容,新建lv

    1,扩容已有lvm 上的lv 1.1 新建pv --> pvcreate /dev/sd* 1.2 把新增的pv添加到lvm -->vgextend vg_ruiy /dev/sd* 1. ...

  8. Android 怎样在linux kernel 中读写文件

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  9. 交换机VLAN研究

    这两天在研究openWRT的网络接口问题,涉及到了交换机的一些概念,主要是跟VLAN相关的,在此总结一下. VLAN在802.11Q中定义,802.11Q帧格式如下图所示: 交换机示意图如下图所示: ...

  10. Android SQLite之乐学成语项目数据库存储

    一.SQLite是什么?为什么要用SQLite?SQLite有什么特点?(下面小编一 一解答) ①SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持 标 ...