hoisting در جاوا اسکریپت چیست ؟

hoisting در جاوا اسکریپت چیست ؟ نوشته شده در   javascript ۳۱ شهریور , ۱۳۹۷ توسط  عباس حسینی

وقتی یک کد به زبان جاوا اسکریپت می بینید انتظار دارید با همان ترتیبی که نوشته شده خط به خط اجرا شود اما در ادامه خواهید دید که در زبان جاوا اسکریپت اینطور نیست و این ممکنه باعث تعجب شما بشود ولی وقتی دلیل آن را برای شما توضیح بدهم بسیار خشنود خواهید شد

برای شروع به کد زیر توجه کنید


console.log( a );
var a = 2 ;

مسلما اگر این کد خط به خط اجرا شود چون متغیر a بعد از console.log قرار دارد باید خطای ReferenceError بدهد ولی نتیجه undefined است یعنی متغیر a تعریف شده ولی مقداری به آن تخصیص داده نشده !! فکر میکنم این باعث تعجب شماست !!
نکته بسیار مهم این است که جاوا اسکریپت قبل از اجرای کد آن را کامپایل میکند و در حین کامپایل عمل lexing انجام میشود

lexing فرآیندی است که در آن یک رشته کد تبدیل به بخش های معنا دار میشود، مثلا عبارت var a = 2; به var a و a=2 تقسیم میشود

بنابراین در حین کامپایل عبارت var a = 2; به دو قسمت معنا دار var a و a=2 تقسیم میشود که اولی هنگام کامپایل اعمال میشود و دومی هنگام اجرای کد اعمال میشود یعنی تعریف متغیر هنگام کامپایل انجام میشود ولی تخصیص مقدار به آن برای موقع اجرای کد نگه داشته میشود در زبان جاوا اسکریپت به این پدیده hoisting میگویند

hoisting به معنای بالا بردن است و علت این نامگذاری این است که تعریف متغیر ها و توابع به بالای کدها آورده میشود یعنی تعاریف قبل از اجرا انجام میگیرند