首页 > 解决方案 > 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;

标签: node.jsvariablesthislocalwinston

解决方案


你没有什么可担心的。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);

推荐阅读