بسته های جاوا اسکریپت مانند پنج نفر توضیح داده شده است

بسته شدن یکی از سخت ترین و در عین حال اساسی ترین مفاهیم در جاوا اسکریپت است. اگر تا به حال خود را سردرگم کرده اید که چرا متغیرهای خاص پس از اجرای یک عملکرد همچنان ادامه دارند ، پس در جای مناسب هستید. بیایید آن را به ساده ترین روش ممکن تجزیه کنیم.
تعطیلی چیست؟
بسته شدن ها هنگامی اتفاق می افتد که یک عملکرد متغیرها را از دامنه اطراف آن به یاد می آورد ، حتی پس از آنکه دامنه از آن خارج شد. به زبان ساده ، بسته شدن به یک عملکرد اجازه می دهد تا حتی پس از پایان عملکرد والدین ، به متغیرهای مربوط به دامنه والدین خود دسترسی پیدا کند.
به این شکل فکر کنید:
تصور کنید که از یک نانوایی بازدید می کنید و یک کیک سفارشی سفارش می دهید. نانوا (عملکرد) سفارش شما (متغیرها) را می گیرد ، وارد آشپزخانه می شود (اجرای عملکرد والدین به پایان می رسد) ، و بعداً با کیک شما (دسترسی به متغیرها) باز می گردد. نانوا هنوز آنچه را که سفارش داده اید به یاد می آورد حتی اگر دیگر در پیشخوان نیستید!
درک دامنه و محیط واژگانی
برای درک بسته شدن ، ابتدا باید درک کنیم دامنهبشر
1. دامنه عملکرد جهانی در مقابل عملکرد
let globalVar = "I am global";
function testFunction() {
let localVar = "I am local";
console.log(globalVar); // ✅ Accessible
console.log(localVar); // ✅ Accessible
}
console.log(globalVar); // ✅ Accessible
console.log(localVar); // ❌ Error: localVar is not defined
متغیرهای اعلام شده در یک تابع از خارج قابل دسترسی نیستبشر اما بسته شدن به ما امکان می دهد تا در این محدودیت کار کنیم.
2. دامنه و بسته های واژگانی
جاوا اسکریپت استفاده می کند اسکوپی واژگان، توابع معنی می توانند از دامنه والدین خود به متغیرها دسترسی پیدا کنند.
function outerFunction() {
let outerVar = "I am from outer function";
function innerFunction() {
console.log(outerVar); // ✅ Accessible due to closure
}
return innerFunction;
}
const myClosure = outerFunction();
myClosure(); // Output: "I am from outer function"
در اینجا innerFunction
دسترسی به outerVar
حتی بعد از outerFunction
اجرای آن را به پایان رسانده است.
چگونه بسته شدن کار می کند (با مثال)
مثال 1: یک بسته شدن ساده
function makeCounter() {
let count = 0;
return function () {
count++;
console.log(count);
};
}
const counter = makeCounter();
counter(); // Output: 1
counter(); // Output: 2
حتی makeCounter()
اجرای آن را به پایان رسانده است ، عملکرد برگشتی دسترسی به آن را حفظ می کند count
به دلیل بسته شدن
مثال 2: بسته شدن در setTimeout
function delayedMessage(msg, delay) {
setTimeout(function() {
console.log(msg);
}, delay);
}
delayedMessage("Hello after 2 seconds!", 2000);
عملکرد داخلی در داخل setTimeout
به یاد می آورد msg
متغیر ، حتی اگر delayedMessage
قبلاً اجرا شده است.
موارد استفاده در دنیای واقعی از بسته شدن
بسته شدن فقط یک مفهوم نظری نیست. آنها دارند برنامه های کاربردی در برنامه نویسی جاوا اسکریپت.
1. محاصره داده ها (ایجاد متغیرهای خصوصی)
بسته شدن به ما کمک می کند تا ایجاد کنیم متغیرهای خصوصی، آنها را از بیرون غیرقابل دسترسی می کند.
function secretMessage() {
let secret = "I am hidden";
return function() {
console.log(secret);
};
}
const revealSecret = secretMessage();
revealSecret(); // Output: "I am hidden"
console.log(secret); // ❌ Error: secret is not defined
2. کارخانه های عملکرد و کاری
بسته شدن به ما اجازه می دهد تا ایجاد کنیم توابع سفارشی پویا
function multiplier(factor) {
return function (number) {
return number * factor;
};
}
const double = multiplier(2);
console.log(double(5)); // Output: 10
const triple = multiplier(3);
console.log(triple(5)); // Output: 15
3. یادآوری برای بهینه سازی عملکرد
بسته شدن در نتایج ذخیره سازی برای بهینه سازی عملکرد.
function memoizedAdd() {
let cache = {};
return function (num) {
if (num in cache) {
console.log("Fetching from cache");
return cache[num];
}
console.log("Calculating result");
let result = num + 10;
cache[num] = result;
return result;
};
}
const addTen = memoizedAdd();
console.log(addTen(5)); // Output: Calculating result, 15
console.log(addTen(5)); // Output: Fetching from cache, 15
اشتباهات رایج و بسته شدن اشکال زدایی
1. نشت حافظه ناخواسته
از آنجا که بسته ها به متغیرها مراجعه می کنند ، می توانند ایجاد کنند نشت حافظه اگر به درستی اداره نشود.
function leakyFunction() {
let bigArray = new Array(1000000).fill("I am a big array");
return function () {
console.log(bigArray.length);
};
}
const leakyClosure = leakyFunction();
// The large array remains in memory even if it's not needed!
💡 راه حل: از نگه داشتن متغیرهای بزرگ غیر ضروری در بسته شدن خودداری کنید.
2. مسائل مربوط به حل و فصل در حلقه ها
یک اشتباه رایج هنگام استفاده رخ می دهد var
داخل حلقه ها
for (var i = 1; i <= 3; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
// Output: 4, 4, 4 (not 1, 2, 3!)
💡 راه حل: استفاده کردن let
به جای var
برای اطمینان از مسدود کردن مناسب.
for (let i = 1; i <= 3; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
// Output: 1, 2, 3 ✅
پایان
بسته شدن یک مفهوم اساسی در JavaScript است که به توابع اجازه می دهد تا آنها را به خاطر بسپارند دامنه والدین حتی بعد از اعدام آنها نقش مهمی در دارند محصور سازی داده ها ، کارخانه های عملکرد ، یادآوری و برنامه نویسی ناهمزمانبشر
غذای اصلی:
✅ توابع به دلیل بسته شدن ، دسترسی به دامنه بیرونی خود را حفظ می کنند.
✅ بسته شدن به ایجاد کمک می کند متغیرهای خصوصیبا توابع بهینه شدهوت عملکرد بهتربشر
✅ مراقب باشید نشت حافظه وت مسائل مربوط به scoping هنگام استفاده از بسته شدن
با تسلط بر تعطیلی ، شما مهارت های JavaScript خود را بالا ببرید و کد تمیزتر و کارآمدتر بنویسید!
🚀 خواندن توصیه شده: