Node.js 全局对象

Node.js 中的全局对象和模块级别全局变量

问题

Node.js 有哪些全局对象?

解答

全局对象的概念

在浏览器中,window 是全局对象,而 Node.js 中的全局对象是 global

Node.js 中用 var 声明的变量不属于全局变量,只在当前模块生效。所有用户代码都是模块级别的,只能通过 exports 对象传递给模块外部。

真正的全局对象

Class: Buffer

处理二进制和非 Unicode 编码的数据。Buffer 类似整数数组,在 V8 堆中分配内存,创建后无法改变大小。

process

进程对象,提供当前进程的信息和控制。可以获取命令行参数、版本、操作系统等信息。

// 启动:node index.js 参数1 参数2 参数3
process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});

// 输出:
// 0: /usr/local/bin/node
// 1: /Users/mjr/work/node/process-args.js
// 2: 参数1
// 3: 参数2
// 4: 参数3

console

用于打印 stdout 和 stderr。

// 输出内容
console.log("hello");

// 清空控制台
console.clear();

// 打印调用栈
function test() {
  demo();
}

function demo() {
  foo();
}

function foo() {
  console.trace();
}

test();

定时器和延时器

// 定时器
setInterval(callback, delay[, ...args])
clearInterval(timer)

// 延时器
setTimeout(callback, delay[, ...args])
clearTimeout(timer)

global

全局命名空间对象,包含 process、console、setTimeout 等。

console.log(process === global.process) // true

模块级别的全局变量

这些变量在每个模块中都存在,但不是真正的全局变量,在命令交互中无法使用。

__dirname

获取当前文件所在的路径,不包括文件名。

// 从 /Users/mjr 运行 node example.js
console.log(__dirname); // /Users/mjr

__filename

获取当前文件的完整路径,包括文件名。

// 从 /Users/mjr 运行 node example.js
console.log(__filename); // /Users/mjr/example.js

exports

module.exports 的简写,用于导出模块内容。

exports.name = name;
exports.age = age;
exports.sayHello = sayHello;

module

当前模块的引用,通过 module.exports 指定模块导出的内容。

require

用于引入模块、JSON 或本地文件。可以从 node_modules 引入模块,也可以使用相对路径引入本地文件。

关键点

  • Node.js 的全局对象是 global,而非浏览器的 window
  • 真正的全局对象包括 Buffer、process、console、定时器等,在任何地方都可访问
  • 模块级别的全局变量(如 __dirname__filenamerequire)只在模块内可用
  • var 声明的变量只在当前模块生效,不是全局变量
  • 通过 module.exportsrequire 实现模块间的数据传递