برنامه نویسی

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

بسته شدن یکی از سخت ترین و در عین حال اساسی ترین مفاهیم در جاوا اسکریپت است. اگر تا به حال خود را سردرگم کرده اید که چرا متغیرهای خاص پس از اجرای یک عملکرد همچنان ادامه دارند ، پس در جای مناسب هستید. بیایید آن را به ساده ترین روش ممکن تجزیه کنیم.


تعطیلی چیست؟

بسته شدن ها هنگامی اتفاق می افتد که یک عملکرد متغیرها را از دامنه اطراف آن به یاد می آورد ، حتی پس از آنکه دامنه از آن خارج شد. به زبان ساده ، بسته شدن به یک عملکرد اجازه می دهد تا حتی پس از پایان عملکرد والدین ، ​​به متغیرهای مربوط به دامنه والدین خود دسترسی پیدا کند.

به این شکل فکر کنید:
تصور کنید که از یک نانوایی بازدید می کنید و یک کیک سفارشی سفارش می دهید. نانوا (عملکرد) سفارش شما (متغیرها) را می گیرد ، وارد آشپزخانه می شود (اجرای عملکرد والدین به پایان می رسد) ، و بعداً با کیک شما (دسترسی به متغیرها) باز می گردد. نانوا هنوز آنچه را که سفارش داده اید به یاد می آورد حتی اگر دیگر در پیشخوان نیستید!


درک دامنه و محیط واژگانی

برای درک بسته شدن ، ابتدا باید درک کنیم دامنهبشر

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 خود را بالا ببرید و کد تمیزتر و کارآمدتر بنویسید!

🚀 خواندن توصیه شده:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا