@zuart
... уже и не знаю, нуп, похоже ...

Насколько забивает память «const self = this» в методах классов?

Приветствую. Нужна помощь специалистов!
Попробую описать на упрощенном примере request(), т.к. не знаю, как просто на словах описать =)
Оригинал кода по сути тут как бы и не разместить, т.к. это пока только алгоритмический функциональный вид.

Использование в функциональном виде:
let varName;
function result(body, ext) {
	varName = ext;
	...
};
function req(params, ext) {
	request(params, (err, req, body) => {
		result(body, ext);
	});
};


Использование в классовом виде:
class CLS {
	constructor() {
		this.varName = null;
	};
	...
	result(body, ext) {
		this.varName = ext;
		...
	};

	req(params, ext) {
		const self = this;
		request(params, (err, req, body) => {
			self.result(body, ext);
		});
	};
	...
};


Использование классов более оправданно, т.к. требуется наследование + классовые свойства (несколько объектов одного класса, каждый со своим состоянием и данными). Однако с учетом того, что потребуется довольно много методов с обратным вызовом смущает необходимость использования вставки const self = this;

Насколько она будет потреблять память, с учетом того, что вызовы этих методов будут постоянными... Не окажется ли, что из-за этих self - ов будут потери памяти со всеми нехорошими вытекающими?!

Вариант "попробовать и понаблюдать", конечно самый хороший, но вот переделывать с классового на процедурный стиль потом может оказаться огромной проблемой.
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
yarkov
@yarkov
https://github.com/yarkovaleksei/toster-extension
const self = this;
request(params, (err, req, body) => {
      self.result(body, ext);
});

А зачем тут self, если у вас стрелочная функция?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Задачка на подумать:
class A {
    answer: null;
    constructor(answer) {
        this.answer = answer;
    }
}
const a = new A(42);
const b = a;
b.answer = 24;
console.log(a.answer); // что выведет? почему? сколько в памяти содержится экземпляров класса A?


Ну а вообще Алексей Ярков правильно написал, у вас там стрелочная функция и self вам нужен как рыбе зонтик.
Ответ написан
Robur
@Robur
Знаю больше чем это необходимо
Даже если вы уберете self - вы каждый раз создете новую функцию, и это займет куда больше памяти.

Вы не о том переживаете. С одной стороны вам правильно сказали - не стоит беспокоиться о self, с другой - это не значит что беспокоиться вообще не стоит. И это не зависит от того как вы пишете код - с классами или без. в функциональном стиле можно легко памяти израсходовать в разы больше не заметив.

Если по сути примера - self у вас будет в замыкании, останется там висеть пока где-то есть живая ссылка на это замыкание, то есть пока где-то есть ссылка на функцию которую вы передаете в helper.method. как только сборщик мусора сможет это все собрать - память освободится. Если ссылки не умирают и вы вызываете эту функцию раз за разом - память закончится даже если вы уберете self вообще.

Тут важно убедиться что у вас нигде нет утечек памяти. Если код такой что должен работать долго, упорно и хорошо, например большие и сложные математические вычисления или важен реалтайм (чтобы сборщик мусора не ставил все внезапно на паузу) - то тут нужны специальные техники, чтобы по максимуму избежать создания любого нового объекта в памяти.

Читайте про сборщик мусора, как он работает и откуда берутся утечки памяти в node.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы