Node.js-变量作用域和垃圾回收

时间:2018-09-18 10:06:57

标签: node.js variables this local winston

我是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;

1 个答案:

答案 0 :(得分:0)

您不必担心。 logger变量应在Logger#constructor函数退出后立即销毁,但是销毁logger变量并不意味着销毁引用了该变量的对象。

您必须确定一件事-logger.errorlogger.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);