Node.js 全局对象

全局,即程序中任何地方都可以使用,Node.js 内置了多个全局变量、全局对象和全局函数,在开发 Node.js 程序时都可以使用,下面分别对它们进行讲解。

全局变量

Node.js 中的全局变量有两个,分别是 __filename__dirname,它们的说明如下。

  • __filename 全局变量:__filename 表示当前正在执行的脚本的文件名,包括文件所在位置的绝对路径,但该路径和命令行参数所指定的文件名不一定相同。如果在模块中,则返回的值是模块文件的路径。

  • __dirname 全局变量:__dirname 表示当前执行的脚本所在的目录。

例如,下面代码用来分别输出 Node.js 中两个全局变量的值:

console.log('当前文件名:',__filename);
console.log('当前目录:',__dirname);

程序运行效果如图4.1所示。

image 2024 04 08 22 58 15 886
Figure 1. 图4.1 输出 Node.js 中全局变量的值

全局对象

全局对象可以在 Node.js 程序的任何地方进行访问,它可以为程序提供经常使用的特定功能。Node.js 中的全局对象如表4.1所示。

image 2024 04 08 22 58 47 207
Figure 2. 表4.1 Node.js 中的全局对象

接下来分别讲解 console 对象和 process 对象的使用,exports 对象将在4.2节中讲解。

global 对象

globalNode.js 的全局对象,类似于浏览器中的 window,但在 Node.js 中运行时上下文不同。

global.myVar = "Hello";
console.log(myVar); // 输出: Hello

console 对象

console 对象提供了 Node.js 控制台的标准输出,其常用方法及说明如表4.2所示。

image 2024 04 08 22 59 37 915
Figure 3. 表4.2 console对象的常见方法

1)console.log()方法

console.log() 方法中,可以使用占位符输出变量(如数字变量、字符串变量和 JSON 变量等),常用的占位符如表4.3所示。

image 2024 04 08 23 00 58 311
Figure 4. 表4.3 console.log()方法中的常用占位符

例如,下面代码使用 %d 占位符输出一个整数值:

console.log('变量的值是:%d',57);

上面代码中,在 console.log() 方法里添加了两个参数。第一个参数是字符串 '变量的值是:%d',第二个参数是数字 57。其中,%d 是占位符,会寻找后面位置的数字,因为第二个参数 57,紧紧跟在后面,所以输出结果如下:

变量的值是:57

使用 console.log() 方法输出内容时,还可以有多个占位符,示例代码如下:

console.log('%d+%d=%d',273,52,273+52);
console.log('%d+%d=%d',273,52,273+52,52273);
console.log('%d+%d=%d & %d',273,52,273+52);

上面代码运行效果如下:

273+52=325
273+52=325 52273
273+52=325 & %d

观察代码可以发现,第 1 行代码中,占位符的个数是 3 个,后面的数字变量的个数也是 3 个,所以输出结果是 “273+52=325”;第 2 行代码中,占位符的个数是 3 个,但是后面数字变量的个数是 4 个,输出结果 “273+52=325 52273”,说明多出的数字变量 52273 原样输出;第 3 行代码中,占位符的个数是 4 个,但是后面数字变量的个数是 3 个,输出结果 “273+52=325 & %d”,说明多余的占位符没有找到匹配的数字变量,只能原样输出。

使用其他占位符的示例代码如下:

console.log('字符串 %s','hello world','和顺序无关');
console.log('JSON %j',{name:'Node.js'});

上面代码运行效果如下:

字符串 hello world 和顺序无关
JSON {"name":"Node.js"}

2)console.time() 方法和 console.timeEnd() 方法

console.time() 方法和 console.timeEnd() 方法用来记录程序的执行时间段。console.time() 方法用来开始计时,其参数只是起到标识的作用;console.timeEnd() 方法用来结束计时,并输出程序运行所需的时间,它在显示结果时,会在标识参数后面自动添加以毫秒为单位的时间。例如,下面代码用来输出执行 10 的阶乘运算所需要的时间:

//开始计时
console.time('时间');
var output = 1;
for (var i = 1; i <= 10; i++) {
     output *= i;
}
console.log('Result:', output);
//结束计时,并输出程序执行时间
console.timeEnd('时间');

运行效果如下:

//开始计时
console.time('时间');
var output = 1;
for (var i = 1; i <= 10; i++) {
     output *= i;
}
console.log('Result:', output);
//结束计时,并输出程序执行时间
console.timeEnd('时间');

运行效果如下:

Result: 3628800
时间: 11.027ms

程序的执行时间不是固定时间,它与计算机配置有关。

process 对象

process 对象用于描述当前程序的状态,与 console 对象不同的是,process 对象只在 Node.js 中存在,在 JavaScript 中并不存在该对象。process 对象的常用属性及说明如表4.4所示。

image 2024 04 08 23 09 59 443
Figure 5. 表4.4 process 对象的常用属性

process 对象的常用方法及说明如表4.5所示。

image 2024 04 08 23 10 30 750
Figure 6. 表4.5 process 对象的常用方法

【例4.1】输出 process 对象常用属性的值。(实例位置:资源包\源码\04\01)

代码如下:

console.log('- process.env:', process.env);
console.log('- process.version:', process.version);
console.log('- process.versions:', process.versions);
console.log('- process.arch:', process.arch);
console.log('- process.platform:', process.platform);
console.log('- process.connected:', process.connected);
console.log('- process.execArgv:', process.execArgv);
console.log('- process.exitCode:', process.exitCode);
console.log('- process.mainModule:', process.mainModule);
console.log('- process.release:', process.release);
console.log('- process.memoryUsage():', process.memoryUsage());
console.log('- process.uptime():', process.uptime());

运行效果如下:

- process.env: {
     USERDOMAIN_ROAMINGPROFILE: 'DESKTOP-05BA7LG',
     LOCALAPPDATA: 'C:\\Users\\XIAOKE\\AppData\\Local',
     PROCESSOR_LEVEL: '6',
     ……
}
- process.version: v19.0.1
- process.versions: {
     node: '19.0.1',
     v8: '10.7.193.13-node.16',
     uv: '1.43.0',
     zlib: '1.2.11',
     brotli: '1.0.9',
     ares: '1.18.1',
     modules: '111',
     nghttp2: '1.47.0',
     napi: '8',
     llhttp: '8.1.0',
     openssl: '3.0.7+quic',
     cldr: '41.0',
     icu: '71.1',
     tz: '2022b',
     unicode: '14.0',
     ngtcp2: '0.8.1',
     nghttp3: '0.7.0'
}
- process.arch: x64
- process.platform: win32
- process.connected: undefined
- process.execArgv: []
- process.exitCode: undefined
- process.mainModule: Module {
     id: '.',
     path: 'K:\\nodepro',
     exports: {},
     filename: 'K:\\nodepro\\index.js',
     loaded: false,
     children: [],
     paths: [ 'K:\\nodepro\\node_modules', 'K:\\node_modules' ]
}
- process.release: {
     name: 'node',
     sourceUrl: 'https://nodejs.org/download/release/v19.0.1/node-v19.0.1.tar.gz',
     headersUrl: 'https://nodejs.org/download/release/v19.0.1/node-v19.0.1-headers.tar.gz',
     libUrl: 'https://nodejs.org/download/release/v19.0.1/win-x64/node.lib'
}
- process.memoryUsage(): {
     rss: 28078080,
     heapTotal: 6639616,
     heapUsed: 6031272,
     external: 455122,
     arrayBuffers: 17378
}
- process.uptime(): 0.095098

全局函数

全局函数,即可以在程序的任何地方调用的函数,Node.js 主要提供了 6 个全局函数,其说明如表4.6所示。

image 2024 04 08 23 12 03 079
Figure 7. 表4.6 Node.js 中的全局函数

下面对 Node.js 中全局函数的使用进行讲解。

setTimeout(cb,ms)和clearTimeout(t)

这两个全局函数分别用来设置和取消一个定时器,此处需要说明的是,setTimeout(cb,ms) 设置的定时器仅调用一次指定的方法。示例代码如下:

var timer=setTimeout(function(){
     console.log("您将在2秒后看到这句话")
},2000)
//clearTimeout(timer)

运行上面代码,2秒后将会显示如下内容:

运行上面代码,2秒后将会显示如下内容:

如果将上面代码中的最后一行取消注释,则运行程序时不会输出任何内容,因为虽然前3行代码添加了一个定时器,但是第4行又取消了该定时器,所以在控制台不会输出内容。

setInterval(cb,ms)和clearInterval(t)

这两个全局函数分别用来添加和取消一个定时器。其中参数 cb 为要执行的函数;ms 为调用 cb 函数前等待的时间;t 表示要取消的 setInterval() 方法设置的定时器。使用 setInterval() 方法设置定时器与使用 setTimeout() 方法设置定时器的区别是,使用 setInterval() 方法设置的定时器可以多次调用指定的方法,而使用 setTimeout() 方法设置的定时器只能调用一次指定的方法。示例代码如下:

var i = 0                              //记录执行程序的次数
var timer
timer = setInterval(function () {
     i += 1
     console.log("已执行" + i + "次")
     if (i >= 5) {
          clearInterval(timer)         //执行5次后,取消定时器
          console.log("执行完毕")
     }
}, 2000)

运行上面的代码,每隔 2 秒会显示一次执行函数的次数,直到执行 5 次以后,取消定时器,最终输出结果如下:

已执行1次
已执行2次
已执行3次
已执行4次
已执行5次
执行完毕

setImmediate(callback[,…​args])和clearImmediate(immediate)

这两个全局函数用来安排在 I/O 事件的回调之后立即执行的函数,以及取消 setImmediate() 创建的 Immediate 对象。其中,callback 参数指的是要执行的函数,immediate 参数表示使用 setImmediate() 创建的 Immediate 对象。

I/O(input/output)即输入/输出,通常指数据在内部存储器与外部存储器或其他周边设备之间的输入和输出。

示例代码如下:

console.log("正常执行1");
var a = setImmediate(function () {
     console.log("我被延迟执行了");
});
console.log("正常执行2")
//clearImmediate(a)

上面代码的运行结果如下:

正常执行1
正常执行2
我被延迟执行了

如果将最后一行代码取消注释,则运行结果如下:

正常执行1
正常执行2

queueMicrotask(callback)

将任务添加到微任务队列中。

queueMicrotask(() => console.log("Microtask executed"));