سفارش بیانیه
سفارش بیانیه
ترتیب بیان اظهارات در کد خود لزوماً به همان ترتیب موتور JS آنها را اجرا می کند. این ممکن است یک ادعای عجیب و غریب به نظر برسد ، بنابراین ما فقط به طور خلاصه آن را کشف خواهیم کرد.
اما قبل از انجام این کار ، ما باید در مورد چیزی شفاف باشیم: قوانین/گرامر زبان (به انواع و عنوان گرامر این سری کتاب مراجعه کنید) یک رفتار بسیار قابل پیش بینی و قابل اعتماد برای سفارش بیانیه از دیدگاه برنامه را دیکته می کنند. بنابراین آنچه ما در مورد بحث در مورد ما قرار داریم مواردی نیستند که شما باید در برنامه JS خود مشاهده کنید.
هشدار: اگر تا به حال بتوانید بیانیه کامپایلر را مانند ما که می خواهیم نشان دهیم ، مشاهده کنید ، این یک نقض آشکار از مشخصات خواهد بود ، و بدون شک ناشی از اشکال در موتور JS مورد نظر است – کدام یک که باید سریعاً گزارش و ثابت شود! اما بسیار رایج تر است که شما گمان می کنید که چیزی دیوانه وار در موتور JS اتفاق می افتد ، وقتی در واقع این فقط یک اشکال است (احتمالاً یک “شرایط مسابقه”!) در کد خود شما است – بنابراین ابتدا به آنجا نگاه کنید ، و دوباره و دوباره. Debugger JS با استفاده از نقاط شکست و قدم زدن از طریق خط کد به صورت خط ، قدرتمندترین ابزار شما برای خراب کردن چنین اشکالات موجود در کد شما خواهد بود.
در نظر بگیرید:
var a, b;
a = 10;
b = 30;
a = a + 1;
b = b + 1;
console.log( a + b ); // 42
این کد هیچ گونه ناهماهنگی نسبت به آن ندارد
(غیر از کنسول نادر Async I/O که قبلاً مورد بحث قرار گرفت!) ، بنابراین محتمل ترین فرض این است که این خط را به صورت از بالا به پایین پردازش می کند.
اما این امکان وجود دارد که موتور JS پس از تهیه این کد (بله ، JS گردآوری شده است – به عنوان دامنه و بسته شدن این سری کتاب مراجعه کنید!) ممکن است با تنظیم مجدد (با خیال راحت) ترتیب این گفته ها ، سریعتر کد خود را اجرا کنید بشر اساساً ، تا زمانی که نتوانید تنظیم مجدد را مشاهده کنید ، بازی عادلانه هر چیزی.
به عنوان مثال ، موتور ممکن است سریعتر باشد که در واقع کد مانند این را اجرا کند:
var a, b;
a = 10;
a++;
b = 30;
b++;
console.log( a + b ); // 42
و یا این
var a, b;
a = 11;
b = 31;
console.log( a + b ); // 42
یا دیگری
// because `a` and `b` aren’t used anymore, we can
// inline and don’t even need them!
console.log( 42 ); // 42
در تمام این موارد ، موتور JS در طول تدوین خود بهینه سازی های ایمن را انجام می دهد ، زیرا نتیجه قابل مشاهده نهایی یکسان خواهد بود.
اما در اینجا سناریویی وجود دارد که این بهینه سازی های خاص ناامن است و بنابراین نمی توان مجاز به آن شد (البته این که بگوییم اصلاً بهینه نشده است):
var a, b;
a = 10;
b = 30;
// we need `a` and `b` in their preincremented state!
console.log( a * b ); // 300
a = a + 1;
b = b + 1;
console.log( a + b ); // 42
قوانین ارسال دیدگاه در سایت