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

فکر می کنید اگر این کد را اجرا کنیم چه اتفاقی می افتد؟
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'
چرا این اتفاق می افتد؟
- در
tryبلوک سعی در بازگشت دارد'Apples'، اما خطایی پرتاب می شود. - در
catchبلوک آن را انجام می دهد و برمی گردد'Bananas'بشر - قبل از بازگشت عملکرد
'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 بلوک ، ممکن است سکوت رفتار عملکرد شما را تغییر دهد.
درک این عجیب و غریب به شما کمک می کند تا از اشکالات غیر منتظره جلوگیری کنید و کنترل بیشتری بر جریان کد خود به شما می دهد.
بعداً شما را تسلی دهید!



