Hoisting چیست و چگونه در جاوا اسکریپت عمل میکند؟
Hoisting
چیست و چگونه در جاوا اسکریپت عمل میکند؟ آیا برای توابع و متغیرها رفتار یکسانی دارد؟
١ پاسخ
Hoisting در جاوا اسکریپت فرآیندی است که طی آن اعلانهای متغیر و تابع در مرحله آمادهسازی کد به بالای محدوده مربوطه خود منتقل میشوند. در این رابطه متغیرهای اعلان شده با کلمه کلیدی «Var» به بالای محدوده خود منتقل شده و با «Undefined» مقداردهی اولیه خواهند شد. از طرفی دیگر آنهایی که با استفاده از کلمات کلیدی «Let» و «Const» اعلان شوند تا زمانی که به طور صریح مقداری به آنها اختصاص داده نشود، بدون مقدار اولیه باقی میمانند. همچنین اعلانهای تابع نیز به طور کامل به بالای محدوده خود منتقل میشوند که این ویژگی به آنها اجازه میدهد قبل از تعریف قابل فراخوانی باشند. به زبانی ساده مکانیسم Hoisting ارجاع و استفاده از متغیرها و توابع را قبل از اعلان واقعی آنها در کد تسهیل میکند. در ادامه به صورت عملی به بررسی این موضوع پرداخته خواهد شد.
تصویر ضمیمه شده، چرخه حیات متغیرهای جاوا اسکریپت را ترسیم میکند و در مورد ترتیب اعلان متغیر و مقداردهی اولیه، آگاهی نسبی به برنامهنویس میدهد.با این وجود، به دلیل قابلیت جاوا اسکریپت برای اعلان و مقداردهی اولیه متغیرها به طور همزمان، روش رایج اعلان متغیر شامل الگوی زیر میشود:
1var a = 100;
توجه به این نکته مهم است که در پشت صحنه، جاوا اسکریپت به سختی اعلان متغیر و سپس مقداردهی اولیه را انجام میدهد. همانطور که قبلاً تأکید شد، همه اعلانهای متغیر و تابع تا بالای محدوده مربوطه خود بالا میروند یا به اصطلاح Hoisting در جاوا اسکریپت انجام خواهد شد. همچنین اعلانهای متغیر قبل از اجرای هر کدی پردازش میشوند.
با وجود همه اینها و توجه به نکات گفته شده نوعی تضاد متمایز در مورد متغیرهای اعلان نشده وجود دارد. آنها تا زمانی که کد مربوط به خودشان اجرا نشود، وجود نخواهند داشت. در نتیجه، هنگامیکه مقداری به متغیری اعلان نشده اختصاص داده میشود، به طور ضمنی به عنوان نوعی متغیر سراسری در طول اجرای آن تخصیص، تولید میشود. این بدان معناست که همه متغیرهای اعلان نشده به عنوان متغیرهای سراسری عمل میکنند. برای نشان دادن این رفتار توجه به کد زیر بسیار مهم است:
1function hoist() {
2 a = 20;
3 var b = 100;
4}
5 6hoist();
7
8console.log(a);
9/*
10Accessible as a global variable outside hoist() function
11Output: 20
12*/
13
14console.log(b);
از آنجا که این یکی از ویژگیهای خاص جاوا اسکریپت در مدیریت متغیرها است، توصیه میشود که متغیرها قبل از استفاده اعلان شوند، صرفنظر از اینکه آنها به محدوده تابع یا محدوه سراسری تعلق دارند، این عمل به طور مشخص نشان میدهد که چگونه مفسر باید این متغیرها را در طول زمان اجرا مدیریت کند.
* باز نشر از سایت: 👇
https://blog.faradars.org/hoisting-در-جاوا-اسکریپت/