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、__filename、require)只在模块内可用 - 用
var声明的变量只在当前模块生效,不是全局变量 - 通过
module.exports和require实现模块间的数据传递
目录