✍️ closure یعنی یک تابع همراه با دسترسی به متغیرهای محیطی که در آن ساخته شده. حتی اگر اجرای تابع بیرونی تمام شده باشه، تابع داخلی میتونه مقدارهای لازم آن محیط را به یاد داشته باشه. این ویژگی برای ساخت رفتارهای تنظیمشده، شمارنده خصوصی یا قانون تخفیف کاربرد دارد.
در مثال، createGreeting یک پیشوند میگیره و تابع سلامکردن میسازه. بعد از پایان createGreeting، تابع ساختهشده هنوز به prefix دسترسی دارد. هر بار فراخوانی، همان پیشوند با نام تازه ترکیب میشه. قرار نیست متن پیشوند در متغیر عمومی ذخیره بشه؛ محیط ساخت تابع آن را نگه داشته.
خطای رایج اینه که فکر کنیم متغیرهای محلی با تمام شدن اجرای تابع بیرونی، برای تابع داخلی هم غیرقابل دسترسی میشن. وقتی تابع داخلی هنوز به آنها نیاز دارد، دسترسی حفظ میشه. برای آزمونهای این دوره، تابع سازنده را درون یک تابع ساده صدا میزنیم و خروجی نهایی رشته یا آرایه را برمیگردونیم؛ خود تابع را به عنوان نتیجه آزمون تحویل نمیدیم، چون خروجی باید JSONپذیر باشد.
function createGreeting(prefix) {
return name => prefix + ' ' + name;
}
function greetingDemo(name) {
const greet = createGreeting('سلام');
return greet(name);
}
console.log(greetingDemo('آوا')); // سلام آوا
فعالیت شما
رابطه prefix و تابع greet را در greetingDemo دنبال کن؛ خروجی این wrapper یک رشته است.