Node.js模块作用域与变量垃圾回收:模块内变量为何每次调用都未定义?
这段Node.js模块代码的问题解析
先看你提供的代码:
const { getClient } = require('...'); let authClient; function getAuthClient() { if (!authClient) { authClient = getClient(); } return client; } module.exports = getAuthClient;
首先要指出代码里的明显笔误:函数最后return的是client,但你声明的变量是authClient,这里会直接抛出ReferenceError: client is not defined,这是最优先要修复的问题。
接下来解答你的疑惑:
模块级变量
authClient不会被垃圾回收
Node.js的模块会被缓存,模块加载后,模块作用域内的变量会一直存在于内存中——因为导出的getAuthClient函数形成了闭包,持有对authClient的引用,只要这个函数还能被外部调用,authClient就不会被垃圾回收,它引用的对象自然也会被保留。authClient不会始终处于undefined状态
如果修正了return的笔误(改成return authClient),第一次调用getAuthClient时,authClient是undefined,会执行getClient()并赋值给它;之后再调用时,authClient已经有值了,if (!authClient)的判断会不成立,不会重复创建新的客户端对象,这其实是一种常见的惰性初始化单例模式实现。
你觉得“函数作用域外声明authClient毫无意义”是误解——正因为它是模块级变量,才能在多次函数调用间保留状态,实现单例的效果。如果把authClient放在函数内部声明,那每次调用都会重新初始化,就达不到复用同一个客户端的目的了。
内容的提问来源于stack exchange,提问作者1sentenced
相关产品推荐
相关产品推荐

