درخواست توضیح در مورد کد

پرسیده شده
فعالیت 1063 روز پیش
دیده شده 557 بار
1

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

هر زمانی که vlaue به روزرسانی میشه و message هم برروزرسانی میشه.

پس زمانی که value برابر 3 هست ، همون زمان message برابر Current value is 3 هست.

با این که هر دو شرایط یکسان دارن و از مقدار والد مقادیر رو دریافت میکنن. 

چرا یکی فقط مقدار اول massage رو برمیگردونه ولی تابع getValue مقدار اخر ؟

 

و اینکه تابع logger سه بار فراخوانی کردم ولی تو هر سه بار یه لاگ اونم همون مقدار Current value is 1 داره تحویل میده باز ، مگه نباید بعد سه بار فراخوانی حداقل مشکل برطرف بشه؟

 

 

ممنون میشم راهنمایی کنید یه خورده گیج شدم

 

فایل پیوست

علیرضا بابایی
علیرضا بابایی

8 خرداد 00

1
حذف شده

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

یک نکته رو فکر کنم توجه نکردی این هست با هر بار فراخوانی تابع counter ما به دو تا تابع جدید دسترسی داریم. بعنی با هر بار فرخوانی ما یه logger و getValue جدید داریم. شما از تابع loggger آخرین باری که تابع counter رو فراخوانی کردیم استفاده بکن ببین چه مقداری رو نمایش میده

counter()
counter()

const {
        logger,
        getValue
    } = counter()
    
logger();
console.log(getValue());

 

فایل پیوست

مجتبی سوری

توسط

مجتبی سوری

10 خرداد 00

حذف شده
تشکر استاد این موضوع رو توضیح دادین دقیق موضوع رو متوجه شدم برای اخرین سوال میخواستم بدونم چه نیازی به ,destructure تابع برای فراخوانی توابع داخلش داریم؟
علیرضا بابایی

10 خرداد 00

حذف شده
هیچ الزامی نیست برای راحت تر شدن استفاده از توابع این کار رو انجام دادم
مجتبی سوری

10 خرداد 00

حذف شده
دستتون درد نکنه که یا صبر و حوصله توضیح میدید باعث میشه خستگی آدم در بره
علیرضا بابایی

10 خرداد 00

2
حذف شده

سلام

یک نکته بسیار مهمی وجود داره اینکه ما یک value بیشتر نداریم ولی به ازای هر بار که تابع counter رو فراخوانی میکنیم یک مقدار message ایجاد و داخل حافظه قرار میگیره! زمانی که message داره مقدار دهی میشه هر مقداری که داخل value باشه رو میگیره و جایگزین میشه و دیگه تغییرات اون روی مقدار message اثری نداره.

 

تابعی که داره log میکنه هر دفعه داره مقدار message رو لاگ میگیره که یک مقدار ثابت و تغییر نمیکنه ولی تابع getValue هر دفعه داره مقدار value رو برمیگردونه و یک value هم بیشتر ما نداریم پس همیشه آخرین مقدار رو داریم دریافت میکنیم.

به دلیل اینکه یک scope با استفاده از createIncrement ایجاد شده یکمی شاید در نگاه اول موضوع رو سخت تر کرده باشه! برای اینکه یکمی موضوع ساده تر بشه اون تابع اول رو میشه حذف کرد که موضوع رو راحت تر متوجه بشی. تفاوتش با قبلی اینه که داریم از global scope داریم استفاده میکنیم

 

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
    }
}
فایل پیوست

مجتبی سوری

توسط

مجتبی سوری

10 خرداد 00

1
حذف شده

استاد message رو هر زمان که value تغییر میکنه لاگ میگیرم ; massage هم همزمان با value ؛ مقدار value جدید رو داخل پیام با قبلی جایگزین میکنه و فقط زمان لاگ کردن مقدار اولی رو نشون میشه.

این برام پیچیدگی ایجاد کرد

فایل پیوست

علیرضا بابایی

توسط

علیرضا بابایی

10 خرداد 00

1
حذف شده

بزار مسئله رو خیلی ساده تر بکنیم

let value = 0

let message = `current value is ${value}`

value = 1

console.log(message)

قطعا انتظار ندارید که  message با تغییر value تغییر بکن

فایل پیوست

مجتبی سوری

توسط

مجتبی سوری

10 خرداد 00

1
حذف شده

سلام دوست عزیز
با عرض معذرت خدمت استاد سوری

ببینید متغیر value خارج از تابع هست و یکبار فقط داره برای ما ساخته و مقدار دهی میشه.
و متغیر message که داخل تابع increament وجود داره با هر فراخوانی شدنش میاد یک بار متغیر message رو میسازه و مقدار دهی میکنه. چون الان ما داریم logger با مقدار message اول رو لاگ میکنیم میاد 1 رو برمیگردونه و اگر دو بار دگ فراخوانی کنیم میاد 2 و 3 رو هم نشون میده

 

فایل پیوست

Daniel Mcmahan

توسط

Daniel Mcmahan

10 خرداد 00

حذف شده
نکته این مسئله این هست که به ازای هربار فراخوانی تابع increament ما یک متغیر message داریم با value متفاوت
Daniel Mcmahan

10 خرداد 00