node.js - Node.js - 变量范围和垃圾收集
问题描述
我是 Node.js 和 JavaScript 的新手,所以我的问题可能很愚蠢。我想知道我的代码示例在变量生命周期方面是否正确。在这里,我正在创建自己的记录器模块,它是现有 winston 记录器的包装器,但通过公开其自己的方法来隐藏这种依赖关系。我在类构造函数中创建局部变量'logger',然后使用对“this”的赋值将一些成员方法公开。这个例子有效,但我怀疑这是否是实现它的好方法,因为在构造函数完成后需要局部变量留在内存中。我相信垃圾收集应该跟踪这种情况并且不要破坏局部变量,因为有外部引用,但这样做是一个好习惯吗?我要不要用
this.logger = ...
代替
let logger = ...
保持整个变量暴露(我想避免为了隐藏实现细节)?代码是:
var winston = require('winston');
class Logger {
constructor () {
let logger = winston.createLogger({
level: 'debug',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({filename: 'results.log'})
]
});
this.error = logger.error;
this.warn = logger.warn;
this.info = logger.info;
this.verbose = logger.verbose;
this.debug = logger.debug;
}
}
module.exports = new Logger;
解决方案
你没有什么可担心的。logger
变量应该在Logger#constructor
函数退出后立即销毁,但销毁logger
变量并不意味着销毁引用变量的对象。
您必须确定一件事 -logger.error
和logger.warn
其他记录器方法是上下文无关的。如果不是 - 你必须像这样绑定上下文
this.error = logger.error.bind(logger);
this.warn = logger.warn.bind(logger);
this.info = logger.info.bind(logger);
this.verbose = logger.verbose.bind(logger);
this.debug = logger.debug.bind(logger);
推荐阅读
- django - Django 应用程序在 Heroku 上共享数据库:一次性设置“共享”数据库
- python - 从Python中的字符串中删除特定数量的重复字母
- java - EasyMock 和参数化测试(JUnit 参数化)
- tensorflow - 将自定义输入管道连接到 tf 模型
- javascript - HTML/JS 增量游戏中的错误
- php - 带有 CakePHP 3 的 Gitlab CI
- artifactory - 在 Artifactory 的 Web GUI 中部署文件会生成一个“
未定义的错误 - java-ee-7 - 带有 Apache CFX 3.1.8 客户端实现的 JX-RS 2.0 客户端 API 线程安全问题
- css - Flexbox:试图在段落元素上方获取 H1 元素
- javascript - JS - 数学不正确