بستار (علوم رایانه)
یک بستار (به انگلیسی: Closure) در علوم رایانه تابعی است که شامل بدنه تابع و محیطی است که تابع در آن تعریف شده است.
نمونه
تابع زیر را در جاوااسکریپت در نظر بگیرید:
function init() {
var name = "Mozilla";
function displayName() {
alert(name);
}
displayName();
}
init();
تابع init() یک متغیر محلی به نام name ایجاد میکند، و سپس تابعی به نام displayName() را تعریف میکند. displayName() تابعی است که درون init() تعریف شده، و تنها درون بدنه این تابع قابل دسترسی است. displayName() متغیر محلی ندارد، ولی از متغیر name تعریف شده در تابع خارجیتر باز استفاده میکند.
حال اگر کد بالا را اجرا کنیم، یک جعبه پیغام با محتوای Mozilla باز میشود.
حال کد زیر را در نظر بگیرید:
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
اگر کد بالا را اجرا کنیم، نتیجه همانند کد قبلی خواهد بود.
نکته متفاوت و جالب در اینجا این است که تابع درونی displayName() قبل از اجرا شدن به بیرون از تابع بازگردانده شده است، و موقع اجرا دیگر درون تابع makeFunc نیستیم. با این حال myFunc به متغیرهای درون makeFunc دسترسی دارد.
علت این است که myFunc در اینجا یک بستار شده است، که به محیطی که تابع در آن ایجاد شده دسترسی دارد. این محیط شامل متغیرهای محلی که هنگام ایجاد تابع داخل حوزه بودند میشود. در این مورد، myFunc بستاری است که هم شامل بدنه تابع displayName() است و هم متغیر name که هنگام ایجاد بستار موجود بود.
در زیر نمونه جالبتری را مشاهده میکنید:
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
print(add5(2)); // 7
print(add10(2));
در این نمونه، تابع makeAdder(x) را تعریف کردیم که یک آرگومان x را دریافت میکند و تابع جدیدی را باز میگرداند. این تابع جدید، پارامتری به نام y دریافت میکند و مجموع x و y را باز میگرداند.
در نمونه بالا، add5 و add10 هر دو بستار هستند. هر دوی این بستارها از یک بدنه تابع استفاده میکنند، ولی محیط آنها متفاوت است. در محیط add5 مقدار x برابر با ۵ است ولی در محیط add10 مقدار x برابر با ۱۰ است.