میلاد کاظمی
میلاد کاظمی
خواندن ۳ دقیقه·۳ سال پیش

تصویرسازی فرآیند جاوااسکریپت : HOISTING

مبحث 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 هم می شود)

زمانی که موتور پردازشی جاوااسکریپت از خطی که در واقع ما متغیر ها را مقدار دهی کرده ایم عبور می‌کند، مقادیر موجود در فضای حافظه رم با مقدایر اصلی اختصاص داده شده توسط کد ما، بازنویسی می شود.

همه چیز تمام شد! ?

جمع بندی سریع :

  • به فرایند توابع و متغیرهایی که در فضای رم برای اجرا شدن با مقادیر پیشفرض ذخیره می شوند قبل از اجرا شدن و تخصیص حقیقی توسط کد ما ، Hoisting می گویند.
  • در این ساختار توابع با اشاره و ارجاع به اصل خود تابع ذخیره می شود. متغیرهای تعریف شده با کلمه کلیدی var مقدار پیشفرض undefined را میگیرند و متغیرهای تعریف شده با کلمه های کلیدی let و constبا عنوان uninitializedذخیره می شوند.

من امیدوارم رخداد Hoisting ، حالا که به اتفاقاتی که هنگام اجرای کدمان رخ می دهد نگاهی کردیم، برای شما ابهام کمتری داشته باشد. مث همیشه اگر هنوز این مسئله برای شما منطقی نیست نگرا ن نباشید. هر چه بیشتر با اون سر و کار داشته باشید، درک موضوع برایتان (با توجه به مسائلی که قید کردیم) راحت تر خواهد بود. اگر سوالی دارید از من بپرسید.

من دوست دارم که به شما (در درک بهتر این موضوع) کمک کنم. ?

مترجم : میلاد کاظمی
مطالب بیشتر در آکادمی ذهن افزار
منبع : مقاله Lydia Hallie
javascriptجاوااسکریپتv8nodejs
شاید از این پست‌ها خوشتان بیاید