دلیل بوجود آمدن stale closure

پرسیده شده
فعالیت 1313 روز پیش
دیده شده 561 بار
0

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

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

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

 

فایل پیوست

4
حذف شده

این مورد ارتباطی به استفاده کردن از 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 دسترسی داره که در زمان اجرا تابع ایجاد شده!

 

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

فایل پیوست

مجتبی سوری

توسط

مجتبی سوری

8 مهر 99

حذف شده
ممنون از شما ، اینطور که بنده متوجه شدم بحث اصلی بر میگرده به scope ها و دلیل بوجود اومدن این خاصیت هم scope ها هستن
حذف شده
مثلا اگه message رو بیرون از تابع increment تعریف کنیم و داخل تابع مقدار دهی کنیم ، مثل value ، هر دفعه مقدارش تغییر میکنه
حذف شده
بحث اصلی همون scope
مجتبی سوری

13 مهر 99