تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ علیرضا بابایی
درخواست توضیح در مورد کد
مجتبی سوری حل شده توسط مجتبی سوری

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

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

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

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

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

 

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

 

 

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

 

سلام

یک نکته بسیار مهمی وجود داره اینکه ما یک 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
    }
}
مجتبی سوری ۱۰ خرداد ۱۴۰۰، ۰۳:۴۴

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

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

علیرضا بابایی ۱۰ خرداد ۱۴۰۰، ۰۳:۴۸

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

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

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

 

بهترین پاسخ
مجتبی سوری ۱۰ خرداد ۱۴۰۰، ۰۴:۰۰

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

let value = 0
let message = `current value is ${value}`
value = 1
console.log(message)

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

مجتبی سوری ۱۰ خرداد ۱۴۰۰، ۰۴:۰۹

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

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

 

Daniel Mcmahan ۱۰ خرداد ۱۴۰۰، ۰۴:۲۳