Skip to content

Node.js 全局对象 (Global Objects)

Node.js 提供了一些对象和函数,这些对象和函数在所有模块中都可用,无需显式地 require 它们。这些被称为全局对象或全局变量 (globals)。虽然方便,但过度使用全局变量可能会使代码更难维护和理解。

在浏览器中,全局作用域对象是 window。在 Node.js 中,它是 global。为了编写跨平台(Node.js 和浏览器)的代码,可以使用标准的 globalThis 属性,它在任一环境中都指向正确的全局对象。

任何在函数外部声明的变量(且在模块顶层未使用 const 或 let)在技术上都会成为 global 对象的属性,尽管在现代 JavaScript 中强烈不建议这种做法。

// Example (Avoid doing this in real code!)
global.myGlobalVar = 'I am global';
console.log(myGlobalVar); // Accessible directly
console.log(globalThis.myGlobalVar); // Also accessible via globalThis

有些全局变量特定于当前的模块上下文:

一个字符串,表示当前正在执行的文件的绝对路径。

// In a file named /path/to/your/app/main.js
console.log(__filename);

输出:

/path/to/your/app/main.js

一个字符串,表示包含当前正在执行的文件的目录的绝对路径。

// In a file named /path/to/your/app/main.js
console.log(__dirname);

输出:

/path/to/your/app

这些变量在构建相对于当前文件的路径时特别有用,例如,读取相邻的配置文件或提供静态资源。

在 CommonJS 模块系统中用于导入模块的函数。虽然感觉像是一个全局变量,但它实际上特定于每个模块。

一个表示当前模块的对象,通常用于通过 module.exports 导出功能。

module.exports 的引用,提供一种简写方式进行导出。

Node.js 提供了类似于 Web 浏览器中找到的定时器函数,允许您调度代码执行。

在指定的 delay(以毫秒为单位)后调度 callback 函数执行一次。额外的 args(参数)将传递给回调函数。

它返回一个 Timeout 对象,该对象可与 clearTimeout 一起使用以取消预定的执行。

示例:
function greet(name) {
console.log(`Hello, ${name}! This message is delayed.`);
}
console.log('Scheduling greeting...');
const timeoutId = setTimeout(greet, 2000, 'Node Developer'); // Execute after 2 seconds
console.log('Greeting scheduled. Timeout ID:', timeoutId);
// To potentially cancel it later:
// clearTimeout(timeoutId);

取消之前通过 setTimeout 创建的 Timeout 对象。

示例:
function neverCalled() {
console.log('This should not appear.');
}
const doomedTimeout = setTimeout(neverCalled, 1500);
console.log('Timeout scheduled, but will be cleared immediately.');
clearTimeout(doomedTimeout);
console.log('Timeout cleared.');

调度 callback 函数每隔 delay 毫秒重复执行。额外的 args(参数)在每次执行时都会传递给回调函数。

它返回一个 Interval 对象,该对象可与 clearInterval 一起使用以停止重复执行。

示例:
let counter = 0;
function tick() {
counter++;
console.log(`Tick number: ${counter}`);
if (counter >= 5) {
console.log('Stopping interval.');
clearInterval(intervalId);
}
}
console.log('Starting interval...');
const intervalId = setInterval(tick, 1000); // Execute every 1 second
console.log('Interval started. Interval ID:', intervalId);

取消之前通过 setInterval 创建的 Interval 对象。

setImmediate(callback[, …args]) 和 clearImmediate(immediateId)

Section titled “setImmediate(callback[, …args]) 和 clearImmediate(immediateId)”

setImmediate 调度 callback 在事件循环的下一个迭代中执行,特别是在 ‘check’ 阶段,该阶段在 I/O 回调之后运行。它常用于将长时间运行的同步操作分解,以便事件循环可以处理 I/O。

虽然它们不是您直接调用的函数,但这些是至关重要的全局对象:

序号全局名称描述
1Console用于将消息打印到标准输出 (stdout) 和标准错误 (stderr)。提供诸如 console.log()、console.error()、console.warn()、console.table()、console.time()、console.timeEnd() 等方法。
2Process一个提供关于当前 Node.js 进程信息并控制它的对象。关键属性和方法包括:
process.argv: 命令行参数数组。
process.env: 包含环境变量的对象。
process.cwd(): 当前工作目录。
process.exit([code]): 退出进程。
process.on('event', callback): 监听进程相关事件(例如,‘uncaughtException’、‘exit’、‘SIGINT’)。
process.stdout、process.stdin、process.stderr: 标准 I/O 流。
3Buffer用于直接处理二进制数据。对于处理 TCP 流、文件系统操作等至关重要。我们将在后续章节中介绍 Buffer。

注意:虽然许多函数和对象是全局可访问的,但通常推荐的做法是在需要时显式地 require 模块(除了像 console、process、定时器、__filename、__dirname 这样真正基础的全局变量),以使代码依赖项更清晰。