javascriptClosureبستار در جاوااسکریپت
بستار یا Closure در جاوااسکریپت چیست؟ با مثال شمارنده، حفظ دسترسی تابع به محیط تعریف، وضعیت مستقل و تفاوت متغیر زنده با کپی مقدار را بفهمید.
مفهوم به زبان ساده
هر تابع به محیطی که در آن تعریف شده دسترسی دارد. وقتی تابع داخلی پس از پایان تابع بیرونی هم به متغیرهای آن محیط نیاز دارد، این دسترسی حفظ میشود؛ این همان بستار است.
در مثال، makeCounter یک تابع برمیگرداند. تابع برگشتی به count دسترسی دارد و در هر فراخوانی، همان مقدار را افزایش میدهد. لازم نیست count را در متغیری سراسری قرار دهید.
هر بار فراخوانی makeCounter یک محیط تازه میسازد. بنابراین دو شمارندهای که با دو فراخوانی جدا ساخته شدهاند، count مشترک ندارند. بستار به مقدار زندهٔ متغیر دسترسی دارد، نه صرفاً یک عکس ثابت از مقدار آن.
کجا به کار میآید؟
- ساخت شمارنده یا تنظیمات خصوصی برای یک تابع
- حفظ وضعیت در callbackها و ساخت تابعهای قابل تنظیم
از تعریف تا یک مثال واقعی
function makeCounter() {
let count = 0;
return () => ++count;
}
const counter = makeCounter();
console.log(counter());
console.log(counter());
1 2
این مثال چطور کار میکند؟
makeCounter یک count محلی با مقدار صفر میسازد.
تابع پیکانی برگردانده میشود و دسترسی به همان count را حفظ میکند.
counter() اول ۱ و دفعهٔ بعد ۲ برمیگرداند؛ پیشافزایش ++ مقدار جدید را برمیگرداند.
اشتباه رایج
بستار کپی ثابت مقدار نیست. اگر چند تابع به یک متغیر در یک محیط مشترک دسترسی داشته باشند، تغییر آن متغیر برای همه قابل مشاهده است.
این را به خاطر بسپارید
بستار یعنی تابع بههمراه دسترسی به محیط تعریفش؛ راهی برای حفظ وضعیت بدون متغیر سراسری.