Я хотел бы понять, при каких обстоятельствах переменные, которые больше не используются, сохраняются в закрытии и приводят к утечкам памяти. Моим самым предпочтительным результатом было бы "нет", но это, похоже, не так.
Из того, что я понимаю, как только функция объявлена внутри другой функции, ее внутренней [[scope]] присваивается LexicalEnvironment своей инкапсулирующей функции. Эта LexicalEnvironment имеет ссылочные локальные переменные и всю цепочку цепей в этой точке. Это в основном включает в себя все свободные переменные, к которым может обращаться функция (из того, что я понял из lostechies, объяснения javascript).
Здесь возникает первый вопрос: это должно означать all, что эти переменные могут быть достигнуты до тех пор, пока функция будет работать. Например. следующее должно уже протекать:
function a() {
let big = new Array(1000000).join('*'); //never accessed
//function unused() { big; }
return () => void 0;
}
let fstore = [];
function doesThisLeak() {
for(let i = 0; i < 100; i++) fstore.push(a());
}
doesThisLeak();