Open linwu-hi opened 1 year ago
在浏览器 JavaScript 中,通常 window 是全局对象,而在 Node.js 中,全局对象是 global。
window
global
在 Node.js 里,不能在最外层定义一个变量,因为所有的用户代码都是当前模块的,只在当前模块里可用,但可以通过 exports 对象将变量传递给模块外部。
exports
在 Node.js 中,用 var 声明的变量并不属于全局的变量,它们只在当前模块生效。真正的全局变量是挂载在 global 对象上的属性。
var
像上述的 global 全局对象则在全局作用域中,任何全局变量、函数、对象都是该对象的一个属性值。
我们可以将全局对象分为两类:
真正的全局对象
模块级别的全局变量
下面给出一些常见的真正的全局对象:
Buffer 类用于处理二进制数据以及非 Unicode 编码的数据。
Buffer
Unicode
在 Buffer 类的实例化中存储了原始数据。Buffer 类似于一个整数数组,在 V8 堆原始存储空间给它分配了内存。
一旦创建了 Buffer 实例,则无法改变大小。
// 创建一个包含字节 [1, 2, 3] 的 Buffer。 const buf = Buffer.from([1, 2, 3]); // 输出: <Buffer 01 02 03> console.log(buf);
process 对象提供有关当前进程的信息和控制。它是一个全局变量,无需使用 require() 就可以访问它。
process
require()
process 对象包含了许多有用的属性,比如 process.argv,用于获取执行脚本时的命令行参数。
process.argv
启动进程:
node index.js 参数1 参数2 参数3
index.js 文件如下:
process.argv.forEach((val, index) => { console.log(`${index}: ${val}`); });
输出如下:
/usr/local/bin/node /Users/mjr/work/node/process-args.js 参数1 参数2 参数3
除此之外,process 对象还包含其他信息,如版本、操作系统等。
console 对象用于打印到标准输出和标准错误输出。它是 stdout 和 stderr 的简单封装。
console
stdout
stderr
最常用的打印函数:console.log
console.log
console.log("hello");
清空控制台:console.clear
console.clear
打印函数的调用栈:console.trace
console.trace
function test() { demo(); } function demo() { foo(); } function foo() { console.trace(); } test();
setInterval() 方法用于按指定的周期调用函数。clearInterval() 方法用于取消由 setInterval() 方法设置的定时器。
setInterval()
clearInterval()
setInterval(callback, delay[, ...args])
callback 每 delay 毫秒重复执行一次。
callback
delay
// 每 1000 毫秒输出一次 "Hello" const intervalId = setInterval(() => { console.log("Hello"); }, 1000);
clearInterval 用于取消定时器的调用。
clearInterval
clearInterval(intervalId);
setTimeout() 方法用于在指定的毫秒数后调用函数。clearTimeout() 方法用于取消由 setTimeout() 方法设置的定时器。
setTimeout()
clearTimeout()
setTimeout(callback, delay[, ...args])
callback 在 delay 毫秒后执行一次。
// 3000 毫秒后输出 "Hello" const timeoutId = setTimeout(() => { console.log("Hello"); }, 3000);
clearTimeout 用于取消延时器的调用。
clearTimeout
clearTimeout(timeoutId);
全局命名空间对象,前面提到的 process、console、setTimeout 等都是 global 对象的属性。
setTimeout
console.log(process === global.process); // true
这些全局变量是模块中的变量,每个模块都有,看起来像全局变量
。但在命令交互中无法使用。
这些变量包括:
获取当前文件所在的路径,不包括后续的文件名。
console.log(__dirname); // 输出: /Users/mjr
获取当前文件的路径和文件名,包括后续的文件名。
console.log(__filename); // 输出: /Users/mjr/example.js
exports 对象用于指定一个模块所导出的内容,即可以通过 require() 访问的内容。
exports.name = "John Doe"; exports.age = 30; exports.sayHello = function() { console.log("Hello"); };
module 是对当前模块的引用。通过 module.exports 用于指定一个模块所导出的内容,即可以通过 require() 访问的内容。
module
module.exports
require() 函数用于引入模块、 JSON、或本地文件。可以使用相对路径引入本地模块或 JSON 文件,路径会根据 __dirname 定义的目录名或当前工作目录进行处理。
JSON
__dirname
const myModule = require("./myModule");
优点:
缺点:
补充代码示例:
// 例1:演示模块级别的全局变量 __dirname 和 __filename console.log(__dirname); // 输出当前文件所在的路径,如:/Users/mjr console.log(__filename); // 输出当前文件的路径和文件名,如:/Users/mjr/example.js // 例2:演示模块导出和引入 // myModule.js exports.name = "John Doe"; exports.age = 30; exports.sayHello = function() { console.log("Hello"); }; // app.js const myModule = require("./myModule"); console.log(myModule.name); // 输出: John Doe myModule.sayHello(); // 输出: Hello
面试官:Node.js 中有哪些全局对象?
一、什么是全局对象
在浏览器 JavaScript 中,通常
window
是全局对象,而在 Node.js 中,全局对象是global
。在 Node.js 里,不能在最外层定义一个变量,因为所有的用户代码都是当前模块的,只在当前模块里可用,但可以通过
exports
对象将变量传递给模块外部。在 Node.js 中,用
var
声明的变量并不属于全局的变量,它们只在当前模块生效。真正的全局变量是挂载在global
对象上的属性。像上述的
global
全局对象则在全局作用域中,任何全局变量、函数、对象都是该对象的一个属性值。二、哪些是全局对象
我们可以将全局对象分为两类:
真正的全局对象
模块级别的全局变量
真正的全局对象
下面给出一些常见的真正的全局对象:
Class: Buffer
Buffer
类用于处理二进制数据以及非Unicode
编码的数据。在
Buffer
类的实例化中存储了原始数据。Buffer
类似于一个整数数组,在 V8 堆原始存储空间给它分配了内存。一旦创建了
Buffer
实例,则无法改变大小。process
process
对象提供有关当前进程的信息和控制。它是一个全局变量,无需使用require()
就可以访问它。process
对象包含了许多有用的属性,比如process.argv
,用于获取执行脚本时的命令行参数。启动进程:
index.js 文件如下:
输出如下:
除此之外,
process
对象还包含其他信息,如版本、操作系统等。console
console
对象用于打印到标准输出和标准错误输出。它是stdout
和stderr
的简单封装。最常用的打印函数:
console.log
清空控制台:
console.clear
打印函数的调用栈:
console.trace
clearInterval、setInterval
setInterval()
方法用于按指定的周期调用函数。clearInterval()
方法用于取消由setInterval()
方法设置的定时器。callback
每delay
毫秒重复执行一次。clearInterval
用于取消定时器的调用。clearTimeout、setTimeout
setTimeout()
方法用于在指定的毫秒数后调用函数。clearTimeout()
方法用于取消由setTimeout()
方法设置的定时器。callback
在delay
毫秒后执行一次。clearTimeout
用于取消延时器的调用。global
全局命名空间对象,前面提到的
process
、console
、setTimeout
等都是global
对象的属性。模块级别的全局变量
这些全局变量是模块中的变量,每个模块都有,看起来像全局变量
。但在命令交互中无法使用。
这些变量包括:
__dirname
获取当前文件所在的路径,不包括后续的文件名。
__filename
获取当前文件的路径和文件名,包括后续的文件名。
exports
exports
对象用于指定一个模块所导出的内容,即可以通过require()
访问的内容。module
module
是对当前模块的引用。通过module.exports
用于指定一个模块所导出的内容,即可以通过require()
访问的内容。require
require()
函数用于引入模块、JSON
、或本地文件。可以使用相对路径引入本地模块或JSON
文件,路径会根据__dirname
定义的目录名或当前工作目录进行处理。三、优缺点
优点:
缺点:
补充代码示例:
参考文献