بستار (علوم رایانه)
یک بستار (به انگلیسی: Closure) در علوم رایانه تابعی است که شامل بدنه تابع[پ 1] و محیطی[پ 2] است که تابع در آن تعریف شده است.[1]
نمونه
تابع زیر را در جاوااسکریپت در نظر بگیرید:[2]
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
در اینجا یک بستار شده است، که به محیطی که تابع در آن ایجاد شده دسترسی دارد. این محیط شامل متغیرهای محلی که هنگام ایجاد تابع داخل حوزه[پ 3] بودند میشود. در این مورد، 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
برابر با ۱۰ است.
پانویس
- function body
- environment
- in-scope