Node.js入门教程(二十三):全局对象

一、什么是全局对象?

JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。

在浏览器 JavaScript 中,通常 window 是全局对象,而 Node.js 中的全局对象是 global ,所有全局变量(除了 global 本身以外)都是 global 对象的属性。

在 Node.js 中,我们可以直接访问到 global 的属性,而不需要在应用中包含它。

二、全局对象与全局变量

global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条件的变量是全局变量:

  • 在最外层定义的变量

  • 全局对象的属性

  • 隐式定义的变量(未定义直接赋值的变量)

当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。

需要注意的是,在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文。

注意 :最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。

三、常用全局对象

__filename

__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。如果在模块中,返回的值是模块文件的路径。

复制代码
// 输出全局变量 __filename 的值
console.log(__filename);

执行 main.js 文件:

复制代码
$ node main.js
/web/com/runoob/nodejs/main.js

__dirname

__dirname 表示当前执行脚本所在的目录

复制代码
// 输出全局变量 __dirname 的值
console.log(__dirname);

执行 main.js 文件:

复制代码
$ node main.js
/web/com/runoob/nodejs

四、定时器函数

setTimeout(cb, ms)

setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。setTimeout() 只执行一次指定函数,返回一个代表定时器的句柄值。

复制代码
function printHello() {
    console.log("Hello, World!");
}

// 两秒后执行以上函数
setTimeout(printHello, 2000);

执行结果:

复制代码
$ node main.js
Hello, World!

clearTimeout(t)

clearTimeout(t) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。参数 t 是通过 setTimeout() 函数创建的定时器。

复制代码
function printHello() {
    console.log("Hello, World!");
}

// 两秒后执行以上函数
var t = setTimeout(printHello, 2000);

// 清除定时器
clearTimeout(t);

执行后不会有任何输出,因为定时器被清除了。

setInterval(cb, ms)

setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。

返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。

setInterval() 方法会不停地调用函数 ,直到 clearInterval() 被调用或窗口被关闭。

复制代码
function printHello() {
    console.log("Hello, World!");
}

// 每两秒执行一次以上函数
setInterval(printHello, 2000);

执行结果(每隔两秒输出一次,直到按下 Ctrl + C):

复制代码
$ node main.js
Hello, World!
Hello, World!
Hello, World!
……

五、console 对象

console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。

Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。

console 方法

序号 方法 & 描述
1 console.log([data][, ...]) 向标准输出流打印字符并以换行符结束
2 console.info([data][, ...]) 返回信息性消息,与 console.log 差别不大
3 console.error([data][, ...]) 输出错误消息
4 console.warn([data][, ...]) 输出警告消息
5 console.dir(obj[, options]) 检查对象并以易于阅读的格式显示
6 console.time(label) 开始计时
7 console.timeEnd(label) 结束计时
8 console.trace(message[, ...]) 输出当前执行的代码在堆栈中的调用路径
9 console.assert(value[, message][, ...]) 判断表达式是否为真,为 false 时输出消息

console.log() 示例

复制代码
console.log('Hello world');
console.log('byvoid%diovyb');
console.log('byvoid%diovyb', 1991);

运行结果:

复制代码
Hello world
byvoid%diovyb
byvoid1991iovyb

console.trace() 示例

复制代码
console.trace();

运行结果:

复制代码
Trace:
at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71)
at Module._compile (module.js:441:26)
at Object..js (module.js:459:10)
at Module.load (module.js:348:31)
at Function._load (module.js:308:12)
at Array.0 (module.js:479:10)
at EventEmitter._tickCallback (node.js:192:40)

综合示例

复制代码
console.info("程序开始执行:");

var counter = 10;
console.log("计数: %d", counter);

console.time("获取数据");
// 执行一些代码
console.timeEnd('获取数据');

console.info("程序执行完毕。");

执行结果:

复制代码
$ node main.js
程序开始执行:
计数: 10
获取数据: 0ms
程序执行完毕。

六、process 对象

process 是一个全局变量,即 global 对象的属性。它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口。

process 事件

序号 事件 & 描述
1 exit 当进程准备退出时触发
2 beforeExit 当 node 清空事件循环,并且没有其他安排时触发
3 uncaughtException 当一个异常冒泡回到事件循环时触发
4 Signal 事件 当进程接收到信号时触发(如 SIGINT、SIGUSR1 等)

process 事件示例

复制代码
process.on('exit', function(code) {
    // 以下代码永远不会执行(因为 exit 事件中无法执行异步操作)
    setTimeout(function() {
        console.log("该代码不会执行");
    }, 0);

    console.log('退出码为:', code);
});

console.log("程序执行结束");

执行结果:

复制代码
$ node main.js
程序执行结束
退出码为: 0

退出状态码

状态码 名称 & 描述
1 Uncaught Fatal Exception - 有未捕获异常
2 Unused - 保留,由 Bash 预留用于内置误用
3 Internal JavaScript Parse Error - JavaScript 源码解析错误
4 Internal JavaScript Evaluation Failure - JavaScript 源码评估失败
5 Fatal Error - V8 里致命的不可恢复的错误
6 Non-function Internal Exception Handler - 内部异常处理函数为非函数
7 Internal Exception Handler Run-Time Failure - 异常处理函数自己抛出了异常
8 Unused - 保留
9 Invalid Argument - 未知参数或参数没有值
10 Internal JavaScript Run-Time Failure - JavaScript 源码运行时抛出错误
12 Invalid Debug Argument - 调试参数设置错误
128 Signal Exits - 接收到致命信号(信号代码 + 128)

process 属性

序号 属性 & 描述
1 stdout - 标准输出流
2 stderr - 标准错误流
3 stdin - 标准输入流
4 argv - 命令行参数数组
5 execPath - Node 二进制文件的绝对路径
6 execArgv - Node 可执行文件与脚本文件之间的命令行参数
7 env - 当前 shell 的环境变量对象
8 exitCode - 进程退出时的代码
9 version - Node 的版本
10 versions - 包含 node 版本和依赖的属性
11 config - 编译当前 node 执行文件的配置选项
12 pid - 当前进程的进程号
13 title - 进程名,默认值为 "node"
14 arch - 当前 CPU 的架构('arm'、'ia32' 或 'x64')
15 platform - 运行程序所在的平台系统
16 mainModule - require.main 的备选方法

process 属性示例

复制代码
// 输出到终端
process.stdout.write("Hello World!" + "\n");

// 通过参数读取
process.argv.forEach(function(val, index, array) {
    console.log(index + ': ' + val);
});

// 获取执行路径
console.log(process.execPath);

// 平台信息
console.log(process.platform);

执行结果:

复制代码
$ node main.js
Hello World!
0: node
1: /web/www/node/main.js
/usr/local/node/0.10.36/bin/node
darwin

process 方法

序号 方法 & 描述
1 abort() - 触发 abort 事件,让 node 退出并生成核心文件
2 chdir(directory) - 改变当前工作进程的目录
3 cwd() - 返回当前进程的工作目录
4 exit([code]) - 使用指定的 code 结束进程
5 getgid() - 获取进程的群组标识(POSIX 平台)
6 setgid(id) - 设置进程的群组标识(POSIX 平台)
7 getuid() - 获取进程的用户标识(POSIX 平台)
8 setuid(id) - 设置进程的用户标识(POSIX 平台)
9 getgroups() - 返回进程的群组 ID 数组(POSIX 平台)
10 setgroups(groups) - 设置进程的群组 ID(POSIX 平台)
11 kill(pid[, signal]) - 发送信号给进程
12 memoryUsage() - 返回 Node 进程所用的内存状况
13 nextTick(callback) - 一旦当前事件循环结束,调用回调函数
14 umask([mask]) - 设置或读取进程文件的掩码
15 uptime() - 返回 Node 已经运行的秒数
16 hrtime() - 返回当前进程的高分辨时间

process 方法示例

复制代码
// 输出当前目录
console.log('当前目录: ' + process.cwd());

// 输出当前版本
console.log('当前版本: ' + process.version);

// 输出内存使用情况
console.log(process.memoryUsage());

执行结果:

复制代码
$ node main.js
当前目录: /web/com/runoob/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }

七、本章小结

知识点 说明
global 对象 Node.js 的全局对象,所有全局变量的宿主
__filename 当前执行脚本的绝对路径
__dirname 当前执行脚本所在目录
setTimeout / clearTimeout 单次定时器及其清除
setInterval / clearInterval 重复定时器及其清除
console 控制台输出对象,提供日志、计时、断言等方法
process 进程对象,提供进程控制、环境信息、系统交互等方法

提示process 对象是 Node.js 中最重要的全局对象之一,它提供了与进程和操作系统交互的丰富接口。在编写 CLI 工具、服务监控、进程管理等场景中,process 对象会被频繁使用。nextTick 方法在异步编程中尤其重要,它允许你将回调延迟到当前事件循环结束后执行。

相关推荐
敲敲敲敲暴你脑袋3 小时前
地图瓦片批量改色来啦!
node.js·gis·数据可视化
太子釢1 天前
AI 开发个人记账 App(服务端篇)
node.js·ai编程
cuncaojin1 天前
vim系列之Tmux
vim·tmux
用户64340495148511 天前
Elpis 项目构建工具与前端基建实践总结
node.js
FungLeo1 天前
成为全栈·Node 后端篇·后端测试策略:单元、集成与测试数据库
单元测试·node.js·集成测试·测试策略·成为全栈·测试数据库
FungLeo1 天前
成为全栈·Node 后端篇·评论内容安全:敏感词过滤、三态审核与级联删除
node.js·敏感词过滤·成为全栈·评论内容安全·评论审核·级联删除
FungLeo2 天前
成为全栈·Node 后端篇·阅读量防刷:去重、冷却与计数写分离
node.js·读写分离·数据去重·接口防刷·成为全栈·数据冷却
典典分享指南2 天前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
jupyter·github·vim·idea·visual studio
脉动数据行情12 天前
Node.js WebSocket 实现贵金属实时行情监听 伦敦金 / 伦敦银自动重连方案
websocket·node.js·vim
不老刘2 天前
一行命令解决 Node.js 版本兼容问题:`--openssl-legacy-provider` 深度解析
node.js