درس امروز از مجموعه آموزش جاوا اسکریپت در بانک پروژه درباره عمل Hoisting در جاوا اسکریپت است که در ادامه بیشتر درباره آن توضیح خواهیم داد.
جاوا اسکریپت به طور پیش فرض تعاریف را به بالای دیگر کد ها در هر دامنه (scope) منتقل می کند. یعنی اگر در یک تابع متغیر یا متغیرهایی تعریف شوند، این تعاریف به بالاترین مکان در آن تابع منتقل می شوند. به این کار hoisting در جاوا اسکریپت یا بالابردن می گویند.
تعاریف بالا می روند
در جاوا اسکریپت ، متغیر می تواند پس از استفاده ، تعریف شود.
به عبارت دیگر؛ یک متغیر را می توانیم قبل از اینکه تعریف شود، استفاده کنیم.
هر دو مثال زیر یک نتیجه دارند :
مثال
1 2 3 4 5 6 7 | x = 5; // Assign 5 to x elem = document.getElementById("demo"); // Find an element elem.innerHTML = x; // Display x in the element var x; // Declare x |
مثال
1 2 3 4 5 6 7 | var x; // Declare x x = 5; // Assign 5 to x elem = document.getElementById("demo"); // Find an element elem.innerHTML = x; // Display x in the element |
برای درک این موضوع ، باید اصطلاح “hoisting” را درک کنید.
hoisting رفتار پیش فرض جاوا اسکریپت در انتقال همه تعاریف به بالای دامنه فعلی (به بالای اسکریپت فعلی یا تابع فعلی) است.
کلمات کلیدی let و const
متغیرها و ثابت های اعلام شده با let
یا const
hoisting نمی شوند!
اطلاعات بیشتر در مورد let و const را در JS Let/Const بخوانید .
مقدار دهی اولیه Hoisting نمی شود
جاوا اسکریپت فقط تعاریف را بالا می برد ، نه مقداردهی اولیه را.
نتیجه مثال 1 با نتیجه مثال 2 ، یکسان نیست
مثال
1 2 3 4 5 6 | var x = 5; // Initialize x var y = 7; // Initialize y elem = document.getElementById("demo"); // Find an element elem.innerHTML = x + " " + y; // Display x and y |
مثال
1 2 3 4 5 6 7 | var x = 5; // Initialize x elem = document.getElementById("demo"); // Find an element elem.innerHTML = x + " " + y; // Display x and y var y = 7; // Initialize y |
آیا این بدان معنیست که y در مثال آخر تعریف نشده است؟
دلیل این امر این است که فقط تعریف (var y) به بالا می رود، نه مقدار دهی اولیه (= 7) .
به دلیل hoisting (بالا رفتن)، y قبل از استفاده تعریف شده است ، اما از آنجا که مقدار دهی اولیه بالا نمی رود، مقدار y تعریف نشده است.
مثال 2 را می توان اینگونه نیز نوشت:
مثال
1 2 3 4 5 6 7 8 9 | var x = 5; // Initialize x var y; // Declare y elem = document.getElementById("demo"); // Find an element elem.innerHTML = x + " " + y; // Display x and y y = 7; // Assign 7 to y |
همیشه متغیرهای خود را در بالا تعریف کنید!
بالا بردن یا hoisting (برای بسیاری از توسعه دهندگان) یک رفتار ناشناخته یا نادیده گرفته از جاوا اسکریپت است.
اگر یک توسعه دهنده رفتار hoisting در جاوا اسکریپت را نفهمد ، ممکن است برنامه هایش دچار اشکال (خطا) شوند.
برای جلوگیری از اشکالات ، همیشه همه متغیرها را در ابتدای هر دامنه تعریف کنید.
از آنجا که جاوا اسکریپت کد را اینگونه تفسیر می کند ، “تعریف متغیر ها در ابتدای هر دامنه” همیشه یک قانون خوب است.
جاوا اسکریپت در حالت سخت اجازه نمی دهد که در صورت عدم تعریف، از متغیرها استفاده شود.
در درس بعد “حالت سختگیرانه” را مطالعه کنید.
منبع : W3Schools.com
درس بعدی : حالت سختگیرانه جاوا اسکریپتدرس قبلی : محدوده ها در جاوا اسکریپت