一、简介
- 在
Node.js
中,全局变量是指无需通过require
或其他方式导入即可直接使用的变量。这些变量在所有模块中都可用。
二、常用方法
> __dirname
表示当前模块的目录路径。
-
功能:提供当前文件所在目录的绝对路径。
-
示例:
console.log(__dirname); // 输出:/path/to/current/directory
> __filename
表示当前模块文件的绝对路径。
-
功能:提供当前文件的完整路径,包括文件名。
-
示例:
console.log(__filename); // 输出:/path/to/current/directory/filename.js
> process
表示当前 Node.js
进程的信息和控制。
-
功能:访问环境变量、工作目录、内存使用情况等。
-
常用属性和方法:
console.log(process.env.NODE_ENV); // 获取环境变量 console.log(process.cwd()); // 获取当前工作目录 console.log(process.pid); // 获取当前进程 ID
> Buffer
用于处理二进制数据。
-
功能:创建和操作二进制数据。
-
示例:
const buf = Buffer.from('Hello, Node.js'); console.log(buf.toString()); // 输出:Hello, Node.js
> global(Node.js 专用)
Node.js
的全局对象,相当于浏览器中的 window
,提供对全局作用域的访问。
-
特性:
- Node.js 专用:
global
是Node.js
提供的全局对象,仅在Node.js
环境下可用。在浏览器中,它并不存在。 - 用于全局变量:通过
global
可以访问Node.js
中的全局变量或在全局作用域中定义的变量。
- Node.js 专用:
-
用途:在整个程序中访问全局变量或函数。在 Node.js 中使用
global
作为一个特定的全局对象。例如,它可以用来存储跨模块的数据,或者用于定义全局函数等。 -
示例:
// 在 Node.js 中 global.myVar = 'This is a global variable!'; console.log(global.myVar); // 输出:This is a global variable!
> globalThis(所有环境通用)
这是一个一个标准化的全局对象,无论在哪种环境下都能统一访问全局作用域。在所有 JavaScript
环境(包括浏览器
和 Node.js
)中都可以访问。
-
特性:
- 统一性:
globalThis
是一个跨平台的全局对象,意味着可以在任何JavaScript
环境(无论是浏览器
、Node.js
、Web Worker
、或者其他 JavaScript
环境)中都可以通过它来访问全局作用域。 - 标准化:
globalThis
是ECMAScript 2020(ES11)
标准引入的,因此它在所有支持ECMAScript 2020
的JavaScript
环境中都是可用的。
- 统一性:
-
用途: 跨平台访问全局作用域。用于跨平台编写
JavaScript
代码,确保可以访问全局对象,而不管当前执行环境是浏览器还是Node.js
。 -
示例:
globalThis.myGlobal = 'Hello!'; console.log(globalThis.myGlobal); // 输出:Hello!
// 在 Node.js 中 console.log(globalThis); // 输出:Node.js 的全局对象 // 在浏览器中 console.log(globalThis); // 输出:浏览器的全局对象 (window)
> global
与 globalThis
主要区别
-
主要区别
特性 globalThis
global
适用环境 浏览器、Node.js、Web Worker 等所有 JavaScript 环境 仅在 Node.js 环境下可用 标准化 是 ECMAScript 2020 (ES11) 标准的一部分 Node.js 独有 引用的全局对象 在所有环境中都可以统一引用全局对象 在 Node.js 中指向全局对象,无法在浏览器中使用 兼容性 适用于所有支持 ECMAScript 2020 的 JavaScript 环境 仅适用于 Node.js 环境 -
总结
-
如果需要编写可以在
浏览器
和Node.js
中都能运行的代码,并且想要访问全局作用域,使用globalThis
是最佳选择。 -
如果只在
Node.js
中工作,并且需要访问Node.js
的全局对象,可以使用global
。 -
globalThis
是更现代的选择,因为它可以在多种执行环境中保持一致性,而global
仅限于 Node.js。
-
> setTimeout(callback, delay)
设置一个延时定时器,在指定时间后执行回调函数。
-
示例:
setTimeout(() => { console.log('Executed after 1 second'); }, 1000);
> clearTimeout(timeoutId)
清除通过 setTimeout
创建的延时定时器。
-
示例:
const timeoutId = setTimeout(() => { console.log('This will not execute'); }, 2000); clearTimeout(timeoutId);
> setInterval(callback, delay)
设置一个间隔定时器,每隔指定时间执行一次回调函数。
-
示例:
const intervalId = setInterval(() => { console.log('Runs every 2 seconds'); }, 2000);
> clearInterval(intervalId)
清除通过 setInterval
创建的间隔定时器。
-
示例:
const intervalId = setInterval(() => { console.log('This will stop after 5 seconds'); }, 1000); setTimeout(() => { clearInterval(intervalId); }, 5000);
> setImmediate(callback)
立即执行的函数回调,比 setTimeout
更快。
-
示例:
setImmediate(() => { console.log('Executed immediately after I/O events'); });
> clearImmediate(immediateId)
清除通过 setImmediate
创建的任务。
-
示例:
const immediateId = setImmediate(() => { console.log('This will not execute'); }); clearImmediate(immediateId);
> require
用于引入模块或文件。
-
示例:
const fs = require('fs'); // 引入文件系统模块 fs.writeFileSync('example.txt', 'Hello, World!');
> module
和 exports
表示当前模块的信息及导出的内容。
-
示例:
// 导出模块 module.exports = { hello: 'Hello, world!' }; // 或者使用快捷方式 exports.hello = 'Hello, world!'; // 导入模块 const myModule = require('./myModule'); console.log(myModule.hello); // 输出:Hello, world!
> console
提供控制台日志打印功能。
-
常见方法:
console.log('Log message'); // 打印普通日志 console.error('Error message'); // 打印错误日志 console.warn('Warning message'); // 打印警告日志
> require.resolve
返回模块的绝对路径,但不加载模块。
-
用途:用于定位模块的实际位置。
-
示例:
const path = require.resolve('fs'); console.log(path); // 输出:fs 模块的路径
> require.cache
缓存已加载的模块,避免重复加载。
-
用途:优化性能,或手动清除模块缓存。
-
示例:
const fs = require('fs'); console.log(require.cache); // 输出当前已加载模块的缓存对象 // 清除某个模块缓存 delete require.cache[require.resolve('fs')];
> exports
用于导出模块的接口,是 module.exports
的快捷方式。
-
用途:导出模块内容供其他模块使用。
-
示例:
exports.hello = 'Hello World!';
> __proto__
这是所有对象的原型链(通常通过 Object.getPrototypeOf
替代)。
-
用途:在需要动态修改原型时使用。
-
示例:
const obj = { }; console.log(obj.__proto__); // 输出:Object 的原型
> TextEncoder
和 TextDecoder
用于编码和解码文本。
-
用途:将字符串转换为二进制数据(
Buffer
)或从二进制转换为字符串。 -
示例:
const encoder = new TextEncoder(); const buffer = encoder.encode('Hello, World!'); console.log(buffer); // 输出:Uint8Array const decoder = new TextDecoder(); console.log(decoder.decode(buffer)); // 输出:Hello, World!
> queueMicrotask
将一个回调函数添加到微任务队列中。
-
用途:执行异步操作但优先于下一个事件循环。
-
示例:
queueMicrotask(() => { console.log('This is a microtask'); }); console.log('This is executed first'); // 输出: // This is executed first // This is a microtask
> performance
提供高精度时间测量。
-
用途:测量代码执行时间。
-
示例:
const start = performance.now(); for (let i = 0; i < 1e6; i++) { } // 模拟一些计算 const end = performance.now(); console.log(`Execution time: ${ end - start}ms`);
> URL
和 URLSearchParams
用于处理和解析 URL。
-
用途:解析和操作 URL。
-
示例:
const url = new URL('https://example.com?name=John&age=30'); console.log(url.hostname); // 输出:example.com console.log(url.searchParams.get('name')); // 输出:John
> Intl
提供国际化功能。
-
用途:格式化日期、时间、数字等。
-
示例:
const formatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }); console.log(formatter.format(123456.78)); // 输出:$123,456.78
> Atomics
和 SharedArrayBuffer
用于多线程环境下的共享内存和原子操作(在 Node.js Worker 中使用)。
-
用途:实现线程安全的并发操作。
-
示例:
const buffer = new SharedArrayBuffer(1024); const arr = new Uint8Array(buffer); Atomics.store(arr, 0, 123); console.log(Atomics.load(arr, 0)); // 输出:123
> DTRACE Hooks
这些是为调试和性能分析而设计的,允许开发者挂钩 DTrace
。
-
常见 hooks:
DTRACE_HTTP_SERVER_REQUEST
DTRACE_HTTP_SERVER_RESPONSE
DTRACE_HTTP_CLIENT_REQUEST
DTRACE_HTTP_CLIENT_RESPONSE