برنامه نویسی

درک کامل در جاوا اسکریپت: یک سوال متداول در مصاحبه 🚀🔥

💭 مقدمه

در طول مصاحبه، مصاحبه کننده ممکن است در مورد مفهوم بسته شدن سوال کند تا مهارت شما را به عنوان یک توسعه دهنده جاوا اسکریپت ارزیابی کند.

این مقاله شامل موضوعات زیر است:

  1. تعریف بسته شدن
  2. مزایای مرتبط با بسته شدن
  3. یک سوال مصاحبه خاص در مورد بسته شدن.
  4. راهبردهایی برای پاسخگویی مؤثر به سؤال

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

❓ بسته شدن چیست؟

“بسته شدن به شما امکان می دهد از یک عملکرد داخلی به محدوده عملکرد بیرونی دسترسی داشته باشید.”

یا می توانید بگویید

“بسته شدن ترکیبی از یک تابع همراه با ارجاع به وضعیت اطراف آن (محیط واژگانی) است.”
مثال –

function outer() {
    let name = "John Doe";
    function inner() { // closure
        console.log(name);
    }
    inner();
}
outer(); // John Doe
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد ارائه شده مفهوم بسته شدن را نشان می دهد زیرا شامل دسترسی به متغیری از محدوده تابع بیرونی در محدوده تابع داخلی است.

در اصل، عملکرد درونی به طور موثر در درون عملکرد بیرونی محصور شده یا “بسته” است.

✅مزایای بسته شدن

  1. قابلیت نگهداری داده ها

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

    • با استفاده از الگوی ماژول بسته شدن، می توانید چندین تابع را در یک شی ذخیره کرده و آنها را برگردانید و به کپسوله کردن داده ها دست یابید.
  3. مدولارسازی کد

    • مدولارسازی، یک تمرین برنامه نویسی که شامل حذف کدهای تکراری است، می تواند با استفاده از بسته شدن تسهیل شود.

🚩 سوال مصاحبه

در طول مصاحبه، ممکن است برای ارزیابی درک خود از جاوا اسکریپت، با سوالات مربوط به بسته شدن مواجه شوید.

نمونه سوال: یک قطعه کد بنویسید که اعداد 1 تا 5 را پس از 3 ثانیه تاخیر چاپ می کند.

برای پاسخ به این سوال، فرآیند فکر اولیه شما می تواند به شرح زیر باشد:

  • آرایه ای را برای ذخیره اعداد راه اندازی کنید.
  • از یک حلقه for برای تکرار در آرایه استفاده کنید.
  • تابع setTimeout() را برای چاپ هر عنصر پس از 3 ثانیه تاخیر اجرا کنید.
function interviewQues() {
    for (var i = 1; i <= 5; i++) {
        setTimeout(function() {
            console.log(i);
        }, 3000);
    }
}
interviewQues();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

چرا “6” را پنج بار چاپ می کند؟

هنگام استفاده از کلمه کلیدی var برای اعلام “i” در داخل تابع ()interviewQues، دامنه آن به آن تابع محدود می شود. علاوه بر این، setTimeout در جاوا اسکریپت به صورت ناهمزمان کار می کند، به این معنی که پس از اتمام قسمت همزمان کد اجرا می شود. در حالی که محدوده تابع ()interviewQues در کل یکسان باقی می ماند، حلقه for پنج بار اجرا می شود، هر بار “i” را افزایش می دهد تا به مقدار 6 برسد. پس از آن، setTimeout() راه اندازی می شود و “6” را پنج بار چاپ می کند.

تصویر

به سادگی بگویم، به دلیل var i است.

🔑 نحوه پاسخ دادن

دو راه حل ممکن برای این مشکل وجود دارد:

  • از بسته شدن و IIFE (بیان تابع فوری فراخوانی شده) استفاده کنید.
  • کلمه کلیدی var را با let جایگزین کنید.

یک رویکرد برای حل این مشکل استفاده از بسته شدن است:

function interviewQues() {
    for (let i = 1; i <= 5; i++) {
        (function(j){ // IIFE declaration
            setTimeout(function() {
                console.log(j);
            }, 1000);
        })(i); // IIFE call
    }
}
interviewQues();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پرداختن به این سوال، مفهوم بسته شدن را اجرا کردم، که شامل رابطه بین تابع درونی و تابع یا متغیر بیرونی، همراه با استفاده از IIFE (بیان تابع فراخوانی فوری) است.

در یک IIFE، اعلان تابع و فراخوانی به طور همزمان اتفاق می‌افتد و اجرای فوری تابع را تضمین می‌کند.

با ارسال متغیر “i” به عنوان پارامتر به “j” در IIFE، مقدار “j” پس از 3 ثانیه تاخیر چاپ می شود.

علاوه بر این، یک رویکرد جایگزین برای حل این سوال، جایگزینی کلمه کلیدی “var” با “let” بود.

function interviewQues() {
    for (let i = 1; i <= 5; i++) { 
        setTimeout(function() {
            console.log(i);
        }, 3000);
    }
}
interviewQues();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای رسیدن به نتیجه دلخواه، به سادگی «var» را با «let» جایگزین کنید.

این راه حل چگونه کار می کند؟ هنگامی که از “var” استفاده می شود، “i” به محدوده تابع ()interviewQues محدود می شود و به آن اجازه می دهد هر بار فقط یک مقدار را نگه دارد. با این حال، با استفاده از “let”، “i” در حلقه for-scope می شود و در نتیجه پنج محدوده جداگانه (بسته به تعداد تکرارها) ایجاد می شود. در نتیجه، می توانید به جای تکرار عدد 6، اعداد 1، 2، 3، 4 و 5 را با موفقیت چاپ کنید.

من همیشه به نوشتن علاقه عمیقی داشته‌ام و هیچ چیز بیشتر از ارائه کمک و الهام به دیگران برایم شادی نمی‌آورد. اگر سوالی دارید یا نیاز به راهنمایی دارید، لطفا با من تماس بگیرید. من برای کمک اینجا هستم.

اینستاگرام من – @arjuncoder
Github من – @CoderPOOP
توییتر من – @arjuncodess

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

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

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

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