(译)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 声明的变量都添加到了 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的全局变量,码迷,mamicode.com

时间: 2024-10-17 14:18:38

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

(译)Node.js的模块-exports和module.exports

原文标题:Node.js Module – exports vs module.exports原文链接:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html exports 和 module.exports 有什么区别? 你一定很熟悉 Node.js 模块中的用来在你的模块中创建函数的 exports 对象,就像下面这样. 创建一个叫做rocker.js的文件: exports.name = function() {

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

学习链接:http://www.runoob.com/nodejs/nodejs-global-object.html 在 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性. 全局对象与全局变量 注意: 永远使用 var 定义变量以避免引入全局变量,因为全局变量会污染 命名空间,提高代码的耦合风险. __filename __dirname setTimeout

(译)Node.js的 EventEmitter 教程

原文标题:Node.js EventEmitter Tutorial原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.html 听说过 Node.js 中的 EventEmitter 吗?也许你知道大部分内置的 Node.js 库 都使用它,也许你总是对 EventEmitter 充满好奇,但是没有谁向你解释? 在这个教程中,我会给你一些关于 EventEmitter 类的例子. 你必须熟悉各种 Node.js 中的事件比

Node.js开发入门—Express里的路由和中间件

我们已经基于Express写了HelloWorld示例,还使用express generator工具创建了一个HelloExpress项目,但有一些代码一直没有好好解释,这是因为它们牵涉到路由和中间件等概念,三言两语说不清楚,所以我专门用一篇文章来讲路由和中间件. 路由 通常HTTP URL的格式是这样的: http://host[:port][path] http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资源的URI(Uniform Res

[译]WordPress 4.3 将会用node.js重写

一个核心的wordpress开发者Ryan Boren表示,wordpress4.3 cms系统将会有一个重大的变革,那就是用node.js重写,同时完全兼容之前的版本. WordPress 和 Node.js 开发者以及项目本身已经关注node.js很久了,当然,这早就不是什么秘密了,node.js允许你用javascript写服务端代码. 我们首次使用node.js是在3.7版本中,同时也把Grunt工具加入了我们的开发周期中.自那以后,越来越多的核心版本开始使用javascript,NB的

node.js 全局变量process成员属性和用法

process :process是一个全局变量,即global对象的属性,它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口,process的成员变量argv可以检测出当前运行脚本的实时参数.第一个参数是node的安装目录.第二个参数是当前脚本名,从第三个参数开始,为运行参数.具体例子如下. 1 console.log(process.argv); 将其保存为process.js.在命令行下运行以下命令: node test.js name=test  --v 199

【转】【译】Node.js 是什么?

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:贾厂长链接:https://www.zhihu.com/question/33578075/answer/56951771来源:知乎 如果你去年注意过技术方面的新闻,我敢说你至少看到node.js不下一两次.那么问题来了“node.js是什么?”.有些人没准会告诉你“这是一种通过JavaScript语言开发web服务端的东西”.如果这种晦涩解释还没把你搞晕,你没准会接着问:“为什么我们要用node.js?”,别人一般会告诉

【译】理解node.js事件轮询

Node.js的第一个基本论点是I/O开销很大. 当前编程技术中等待I/O完成会浪费大量的时间.有几种方法可以处理这种性能上的影响: 同步:每次处理一个请求,依次处理.优点:简单:缺点:任何一个请求都可以阻塞所有其他的请求. Fork一个新进程:开一个新进程来处理每个请求.优点:容易:缺点:不能很好的扩展,成百上千个连接意味着成百上千个进程.fork()函数相当于Unix程序员的锤子,因为它很有用,每个问题看起来就像一个钉子,通常会被过度使用.(译者注:直译比较拗口,我理解的意思是,Unix程序

【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93%E4%B8%8ENode-js%E7%9A%84%E5%BC%82%E6%AD%A5IO%E6%9C%BA%E5%88%B6/ 译者:xidui原文: http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html 译者前言 如