Closure-ներ և Memory Leak-եր JavaScript-ում
Չնայած closure-ները հզոր գործիք են՝ երբեմն դրանք կարող են առաջացնել հիշողության արտահոսք (memory leak)
JavaScript-ում closure-ները թույլ են տալիս ֆունկցիաներին պահպանել մուտքի տվյալները իրենց lexical scope-ից, նույնիսկ այն ժամանակ, երբ այդ ֆունկցիան այլևս չի գտնվում նույն սքոփում։ Չնայած closure-ները հզոր գործիք են՝ երբեմն դրանք կարող են առաջացնել հիշողության արտահոսք (memory leak), եթե դրանք սխալ են օգտագործվում։
Այս հոդվածում կքննարկենք՝ ինչպե՞ս կարող են closure-ները բերել հիշողության արտահոսքի, ինչպիսի՞ սխալներ են հաճախ արվում և ինչպե՞ս կանխել դրանք։
function attachListener() {
const largeData = new Array(1000000).fill('🔥');
document.getElementById('btn').addEventListener('click', function handleClick() {
console.log('Clicked!', largeData[0]);
});
}
attachListener();
Խնդիրը․
Լուծում․
function startTimer() {
const userData = { name: "Aram", age: 28 };
setInterval(() => {
console.log("Tick for", userData.name);
}, 1000);
}
startTimer();
Խնդիրը․
Լուծում․
function createElement() {
const bigData = new Array(1000000).fill("💾");
const el = document.createElement('div');
el.onclick = function () {
console.log(bigData[0]);
};
return el;
}
const element = createElement();
// էլեմենտը երբեք չի ավելացվում DOM-ի մեջ, բայց closure-ը դեռ պահում է bigData-ն
Խնդիրը․
Լուծում․
Closure-ները հզոր են, բայց ինչպես ցանկացած հզոր գործիք՝ կարող են բերել խնդիրների, եթե սխալ օգտագործվեն։ Memory leak-երը կարող են առաջանալ, երբ closure-ները պահում են մեծ տվյալներ, որոնք այլևս չեն օգտագործվում, սակայն garbage collect-ը չի մաքրվում։ Լավ պրակտիկան closure-ները մաքուր պահելն է՝ օգտագործելով միայն անհրաժեշտ տվյալներ և ավելորդ կապեր չստեղծելով։
Եթե closure-ների հետ աշխատում ես Event Listener-ներում, interval-ներում կամ DOM-ի հետ, միշտ մտածիր՝ "արդյոք այս տվյալը ինձ իրականում դեռ պետք է"։