我是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;
答案 0 :(得分:0)
您不必担心。 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);