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

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