(译)Node.js的全局变量
原文标题: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的全局变量的更多相关文章
- [译]Node.js - Event Loop
介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...
- 【node.js】全局变量、常用工具、文件系统
学习链接:http://www.runoob.com/nodejs/nodejs-global-object.html 在 JavaScript 中,通常 window 是全局对象, 而 Node.j ...
- node.js的全局变量的注意
在node.js中,如果一个变量没有用var来声明,就会变为全局变量: 看如下代码: 1)6.js function myadd(a) { return a+abc; } function conta ...
- [译]Node.js Interview Questions and Answers (2017 Edition)
原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...
- 译\Node.js应用的持续部署
Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...
- [译]Node.js : Building RESTful APIs using Loopback and MySQL
国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...
- [译]Node.js Best Practices - Part 2
原文: https://blog.risingstack.com/node-js-best-practices-part-2/ 统一风格 在大团队开发JS应用, 创建一个风格指南是很有必要的. 推荐看 ...
- [译]Node.js面试问与答
原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...
- [译]Node.js Best Practices
原文: http://blog.risingstack.com/node-js-best-practices/ 下面的的最佳实践分为代码风格和开发工作流两种. 代码风格 Callback约定 Modu ...
随机推荐
- 批量修改文件名java
package test0715; import java.io.File; public class FileRename {public static void main(String[] arg ...
- 一次U盘安装Ubuntu双系统实录
准备:Win7系统(原来就在我电脑的系统) UltraISO(把系统写进U盘的工具) EasyBCD(双系统引导修复工具) 笔记本电脑(我的是联想Y470N) U盘一个 步骤: U盘准备工作: 插入U ...
- pyhton
http://panda.www.net.cn/cgi-bin/check.cgi?area_domain= http://whois.chinaz.com/ beautifulsoup4 impor ...
- Angular ng-repeat 对象和数组遍历
直接上代码 <!DOCTYPE html> <html> <head> <meta name="description" content= ...
- 为SQL Server 增加链接到SQL Server 的链接服务器
整体的分析一下好有一个思路.我们的目的是完成一个到远程服务器的链接. 第一:我们要知道这台服务器在哪(也就是要知道它的IP地址,如果是在同一个网络中知道它的计算机名也是可以的.因为一台服务器上可以安装 ...
- CSS3自适应字体大小(vw vh)
viewpoint css3提供了一些与当前viewpoint相关的元素,vw,vh,vmin, vmax等. “viewpoint” = window size vw = 1% of viewpor ...
- SMT贴片红胶基本知识
SMT贴片红胶是一种聚稀化合物,与锡膏不同的是其受热后便固化,其凝固点温度为150℃,这时,红胶开始由膏状体直接变成固体. SMT贴片机装贴贴片具有粘度流动性,温度特性,润湿特性等.根据红胶的这个特性 ...
- BZOJ 1101 [POI2007]Zap(莫比乌斯反演)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1101 [题目大意] 求[1,n][1,m]内gcd=k的情况 [题解] 考虑求[1,n ...
- ios7 UIScrollView 尺寸问题
假设在UINavigationController内设置一个UIViewControlller,而UIViewController的第一个子视图是UIScrollView的话,UIScrollview ...
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...