Node.js · Senior · Запитання 5 з 75
Чому замикання може несподівано утримувати пам'ять?
function handler(req) {
const hugeBody = req.body; // 50 MB
const id = hugeBody.id;
emitter.on("done", () => console.log(id));
}- ✓Правильна відповідь: Слухач живе на довгоживучому емітері, а замикання тримає свою область видимості (і, можливо,
hugeBody) для кожного запиту - 2Замикання завжди копіюються разом із повним стеком викликів
- 3Стрілкові функції не можуть бути зібрані збирачем сміття
Пояснення
Справжній баг - слухач, якого ніколи не видаляють. Також V8 може тримати змінні спільного контексту. Видаляйте слухачів, використовуйте once і не захоплюйте великі об'єкти.