تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ Ali Naseri
دلیل بوجود آمدن stale closure
مجتبی سوری حل شده توسط مجتبی سوری

سلام استاد خسته نباشید

دلیل بوجود آمدن stale closure در مثال چیه ؟

اگه به جای const از let در تعریف کردن message استفاده کنیم آیا باز هم امکان داره که stale closure بوجود بیاد؟

 

این مورد ارتباطی به استفاده کردن از const یا let نداره

زمانی که تابع createIncrement رو فراخوانی میکنیم مقداری که داخل متغییر counter قرار میگیره تابع increment هست!

 

بیا یکمی با هم مورد رو شفاف‌تر بکنیم. موافقی؟؟

کد زیر رو در نظر بگیر تفاوتی که داره این تابع createIncrement رو حذف کردم. این حالتم خروجی بازم یکسان


    let value = 0;
    function increment() {
        value = value + 1;
        console.log(value);
        const message = `Current value is ${value}`
        function logger() {
            console.log(message);
        }
        function getValue() {
            return value;
        }
        return {
            logger,
            getValue
        }
    }
    const {
        logger,
        getValue
    } = increment();
    increment();
    increment();
    logger();
    console.log(getValue());

در این  حالت هر دفعه که تابع increment رو فراخوانی بکنی آیا مهم که با const تعریف شده باشه یا let ؟؟

تفاوتی نداره چون متغییر message فقط یک بار ایجاد میشه و داخل حافظه قرار میگیره و نکته مهم این که با هر بار اجرای این تابع یک متغییر message داخل حافظه قرار میگیره که مختص همون اجرا هست و بقیه برنامه به اون دسترسی نداره!

 

بنابراین توابع logger و getValue زمانی که فراخوانی بشن به چه message دسترسی دارند؟؟

به غیر از این به اون message که در زمان فرخوانی increment ایجاد شده؟؟

حالا همین مورد هم در مورد مثالی که حل شده صادق! تنها تفاوتش این که مقدار value دیگه داخل global scope قرار نداره و در ادامه برنامه امکان تغییر یا دستکاری اون وجود نداره

 

بزار بازم شفاف ترش کنیم. بازم موافقی؟؟

کد زیر رو در نظر بگیر

    function randomNumber() {
        let number = Math.random()
        console.log(number)
    }
    function randomNumber2() {
        const number = Math.random()
        console.log(number)
    }
    randomNumber()
    randomNumber()
    randomNumber2()
    randomNumber2()

هر تابعی مقدار number مخصوص به خودش رو داره و تابع log به اون number دسترسی داره که در زمان اجرا تابع ایجاد شده!

 

اگر بازم شفاف نیست بگو تا شفاف‌تر بکنم!!!

بهترین پاسخ
مجتبی سوری ۰۸ مهر ۱۳۹۹، ۱۶:۴۲