برنامه نویسی

چه اتفاقی می افتد که هم سعی کنید و هم در نهایت در جاوا اسکریپت بازگشت؟

فکر می کنید اگر این کد را اجرا کنیم چه اتفاقی می افتد؟

function test() {
  try {
    throw new Error("oops");
  } catch (e) {
    return 'catch';
  } finally {
    return 'finally';
  }
}

console.log(test());

حالت تمام صفحه را وارد کنید

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

در ابتدا ممکن است فکر کنید:

“خوب ، این یک خطا را به وجود می آورد ، بنابراین به داخل بلوک می رود و” گرفتن “را برمی گرداند … درست است؟”

اما نه کاملاً! در واقع این کد باز خواهد گشت finally! اما چرا؟ بگذارید توضیح دهم

چگونه tryبا catch وت return کار

ما معمولاً به آن فکر می کنیم return به عنوان یک خروج فوری ، اما در جاوا اسکریپت ، دقیقاً اینگونه نیست که در زیر کاپوت کار کند. وقتی موتور JS به A برخورد می کند return، چیزی به نام رکورد تکمیل ایجاد می کند.

آن را به عنوان یک یادداشت چسبناک فکر کنید که می گوید:

“سلام ، ما اینجا تمام شدیم. دلیل بازگشت است و در اینجا ارزش پس دادن”

این رکورد در داخل توسط موتور JavaScript تا زمانی که عملکرد واقعاً تمام شود ، نگه داشته می شود.

جریان با finally

در اینجا یک استعاره در دنیای واقعی وجود دارد:

شما به بازار می روید (این عملکرد شماست)

شما سعی می کنید سیب بخرید (امتحان کنید) ، اما اگر آنها از موجودی خارج نیستند ، به جای آن موز دریافت می کنید (گرفتن).

همانطور که می خواهید بررسی کنید ، مادرتان تماس می گیرد و می گوید:
“فراموش کن – فقط شیر بخرید!” (سرانجام)

بنابراین مهم نیست که شما قصد داشتید به خانه بیاورید (سیب یا موز) ، در نهایت شیر ​​می آورید.

در اینجا نسخه کد وجود دارد:

function goToMarket() {
  try {
    throw new Error('No apples today!');
    return 'Apples';
  } catch (e) {
    return 'Bananas';
  } finally {
    return 'Milk';
  }
}

console.log(goToMarket()); // 'Milk'
حالت تمام صفحه را وارد کنید

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

چرا این اتفاق می افتد؟

  1. در try بلوک سعی در بازگشت دارد 'Apples'، اما خطایی پرتاب می شود.
  2. در catch بلوک آن را انجام می دهد و برمی گردد 'Bananas'بشر
  3. قبل از بازگشت عملکرد 'Bananas'، finally بلوک دویدن و آن return 'Milk' همه چیز را نادیده می گیرد.

اینقدر 'Milk' مقدار بازگشت نهایی است

مشخصات ecmascript (به زبان ساده)

با توجه به مشخصات ECMAScript:

  • بوها return در try یا catch بلافاصله برنگردد – این یک رکورد تکمیل ایجاد می کند.
  • در finally بلوک همیشه بدون توجه به اتفاقی که در آن رخ داده است اجرا می شود try یا catch؛
  • اگر finally بلوک خودش را دارد return، این بازده قبلی را بازنویسی می کند.

به همین دلیل finally مقدار بازگشت واقعی می شود.

مرجع

این رفتار از مشخصات ECMAScript پیروی می کند ، که جزئیات نحوه عملکرد تکمیل شده در هنگام اجرای عملکرد را نشان می دهد.

افکار نهایی

در finally بلوک فقط یک بخش “پاکسازی” نیست – اگر مراقب نباشید می تواند ارزش بازگشت عملکرد شما را کنترل کند. حتی اگر try یا catch دارای a return، الف return درون finally آن را نادیده می گیرد

بنابراین دفعه بعد که در حال نوشتن خطا هستید ، قبل از بازگشت به داخل یک بار فکر کنید finally بلوک ، ممکن است سکوت رفتار عملکرد شما را تغییر دهد.

درک این عجیب و غریب به شما کمک می کند تا از اشکالات غیر منتظره جلوگیری کنید و کنترل بیشتری بر جریان کد خود به شما می دهد.

بعداً شما را تسلی دهید!

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

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

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

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