مبحث Hoisting یا به اصطلاح ( بالا بردن )، یکی از اون اصطلاحاتی هست که هر توسعه دهنده جاوااسکریپتی اسم اون رو شنیده، به خاطر اینکه شما بالاخره یه خطای مزاحم رو توی گوگل سرچ کردید و نهایتا به StackOverFlow رسیدید.
جایی که شخصی به شما میگه که این خطا به دلیل Hoisting ایجاد شده است. (Hoistng به معنای بالاکشیدن هست). خب پس این Hoisting چی هست؟
وقتی موتور جاوااسکریپت ، اسکریپت مارو دریافت میکنه، اولین کاری که انجام میده این هست که حافظه مموری رو برای داده های ما تنظیم و اختصاص میده. هیچ کدی در این مرحله اجرا نمیشه، فقط همه چیز را برای اجرا شدن کد محیا میکنه.
نحوه ذخیره function declarations و و متغیرها (Variables) متفاوت است. تابع ها با ارجاع به کل تابع ذخیره می شوند.
قضیه متغیرها Variables یه کمی متفاوته.
در (ES6 ) دو کلمه کلیدی جدید برای تخصیص متغیرها معرفی شد : let
و const
متغیر های تعریف شده با این دو کلمه کلیدی بصورت uninitialized
( بدون مقدار دهی اولیه ) ذخیره می شوند.
متغیرهای تعریف شده با کلمه کلیدی var
با مقدار پیشفرض undefined
ذخیره می شوند.
حالا که مرحله ایجاد، به پایان رسید، میتونیم کد رو در مرحله بعدی اجرا کنیم. بیاید ببینیم چه اتفاقی می افته اگر ما در سه جایگاه ابتدایی console.log رو فراخوانی کنیم قبل از اینکه تابع یا تخصیص هر یک از متغیرها رو در خطوط کدهای بالایی داشته باشم. ( قبل از اینکه تابع یا متغیرها رو در کد تعریف کنیم اون هارو console.log کنیم.)
از اونجایی که توابع (Function) با ارجاع به کل کد تابع ذخیره می شوند، می تونیم اونها رو حتی قبل از خطی که ایجادشون کردیم فراخوانی کنیم.
زمانی که به یک متغیر (variable) که با کلمه کلیدی var
تعریف شده باشه ارجاع میدیم (فراخوانی میکنیم) به سادگی مقدار پیشفرض ذخیره شده undefined
رو بر میگردونه.
با این حال، گاهی اوقات هم می تونه منجر به رفتار "unexpected" ( غیر قابل انتظار ) بشه. در بیشتر اوقات معنیش این هست که شما به طور ناخواسته به اون متغیر ارجاع میدید.
(ینی احتمالا نمیخواید که مقدارvalueعبارت undefined
باشه) ?
به جهت جلوگیری از ارجاع تصادفی یک undefined
مشابه کاری که با کلمه کلیدی var
اتفاق افتاد، هر زمان که ما سعی می کنیم به متغیرهای بدون مقدار اولیه (uninitialized
) دسترسی پیدا کنیم، با پیغام خطای ReferenceError مواجه میشیم.
منطقه قبل از تعریف آنها (temporal dead zone) نامیده میشه : ینی شما نمیتونید قبل ازمقدار دهی و تخصیص به اونا ارجاع بدید و فراخوانیشون کنید(این شامل کلاس های ES6 هم می شود)
زمانی که موتور پردازشی جاوااسکریپت از خطی که در واقع ما متغیر ها را مقدار دهی کرده ایم عبور میکند، مقادیر موجود در فضای حافظه رم با مقدایر اصلی اختصاص داده شده توسط کد ما، بازنویسی می شود.
همه چیز تمام شد! ?
جمع بندی سریع :
var
مقدار پیشفرض undefined
را میگیرند و متغیرهای تعریف شده با کلمه های کلیدی let
و const
با عنوان uninitialized
ذخیره می شوند.من امیدوارم رخداد Hoisting ، حالا که به اتفاقاتی که هنگام اجرای کدمان رخ می دهد نگاهی کردیم، برای شما ابهام کمتری داشته باشد. مث همیشه اگر هنوز این مسئله برای شما منطقی نیست نگرا ن نباشید. هر چه بیشتر با اون سر و کار داشته باشید، درک موضوع برایتان (با توجه به مسائلی که قید کردیم) راحت تر خواهد بود. اگر سوالی دارید از من بپرسید.
من دوست دارم که به شما (در درک بهتر این موضوع) کمک کنم. ?
مترجم : میلاد کاظمی
مطالب بیشتر در آکادمی ذهن افزار
منبع : مقاله Lydia Hallie