✍️ closure فقط برای خواندن یک مقدار ثابت نیست؛ تابع داخلی میتونه متغیر محیط خودش را تغییر بده و در فراخوانی بعدی مقدار تازه را ببینه. به این ترتیب، وضعیت بین چند بار اجرای همان تابع حفظ میشه. شمارنده یکی از سادهترین نمونههای این رفتار است.
مثلاً یک شمارهساز میتونه از ده شروع کنه و با هر درخواست یک شماره بالاتر بده. اگر متغیر شمارنده داخل تابع داخلی از نو تعریف بشه، هر فراخوانی از اول شروع میکنه و حافظهای وجود ندارد. متغیر باید در محیط تابع سازنده باشه و تابع داخلی به همان متغیر دسترسی داشته باشه.
در کد پایین، count یک بار هنگام ساخت next ایجاد میشه. هر بار next اجرا میشه، اول count را یک واحد افزایش میده و بعد آن را برمیگردونه. خطای رایج، جابهجا حساب کردن ترتیب افزایش و return است؛ اگر اول return انجام میشد، جواب فرق داشت. دو فراخوانی داخل آرایه از چپ به راست اجرا میشن و هر دو از یک شمارنده مشترک در همین closure استفاده میکنند.
function makeCounter(start) {
let count = start;
return () => { count += 1; return count; };
}
function counterDemo() {
const next = makeCounter(2);
return [next(), next()];
}
console.log(counterDemo());
فعالیت شما
آرایه خروجی counterDemo را با توجه به افزایش قبل از return انتخاب کن.