Node.js - область видимости переменных и сборка мусора - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в Node.js и JavaScript, поэтому мой вопрос может быть глупым. Я хотел знать, правильный ли мой пример кода с точки зрения времени жизни переменной. Здесь я создаю свой собственный модуль logger, который является оберткой для существующего winston logger, но скрывает эту зависимость, выставляя свои собственные методы. Я создаю локальную переменную '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 голосов
/ 18 сентября 2018

Вам не о чем беспокоиться.Переменная 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);
...