هر چیزی که به زبان جاوااسکریپت میتواند نوشته شود در نهایت به این زبان نوشته خواهد شد. (جف آتوود- خالق Stackoverflow )
در اولین پست خود قصد دارم که به صورت خلاصه نحوه اجرای کدهای جاوااسکریپت رو توضیح بدم. باشد که مفید واقع شود.
یک کد جاوااسکریپت برای اینکه اجرا شود نیاز به یک موتور (Engine) دارد ! انجین یا موتورهای مختلفی وجود دارد . معروفترین آن ها V8 Engine Google است که در کروم و NodeJs هم وجود دارند. این انجین وظیفه خود را در دو مرحله انجام می دهد. ابتدا کدها توسط یک پارسر (parser) در انجین به یک درخت نحو انتزاعی (Abstract Syntax Tree) تبدیل میشود. این ساختار وظیفه چک کردن سینتکس ها و منطق صحیح کد را دارد به طوری که برای تبدیل کد جاوااسکریپت به کد ماشین این این ساختارداده ASTلازم است. (در پست های آینده شاید در مورد AST ) توضیح بیشتری بدهم )
وقتی یک کد جاواسکریپت اجرا میشود یک اتفاق مهم رخ می دهد : انجین یک (ظرف اجرای کلی) Global Execution Context ایجاد میکند در مرورگر این شی ایجاد شده همان window و در NodeJs همان متغیر global است . از اینجا به بعد اجرای کد ۲ فاز میشود :
۱-فاز آفرینش ! (Creation Phase)
۲-فاز اجرای نهایی (Execution Phase)
در مرحله اول اتفاقات دیگری قدم به قدم می افتد :
۱- آبجکت های متغیر (Variable Object) ساخته می شوند . شامل (توابع تعریفی یا همان function decleration ها و متغیرها) اساسا بحث hoisting اینجا نمود پیدا میکند . که در آینده توضیح خواهم داد.
۲- زنجیره اسکوپ (Scope Chain)تشکیل میشود. تا مشخص شود که سطح دسترسی متغیر ها در اسکوپ های تودرتو چگونه است . (برای بحث closureاین قسمت مهم است)
۳- یک کلید به اسم this تعریف میشود. ( که البته در هر جایی قابل استفاده نیست)
۴ - اختصاص حافظه هیپ برای ذخیره متغیرها و نگهداری رفرنس آبجکت ها.
پس از این مرحله، فاز اجرا شروع میشود. که خط به خط کد اجرا خواهد شد.
توجه کنید که جاوااسکریپت به صورت سینکرون (synchronous) اجرا میشود. اشتباهی که بسیاری افراد دارند این است که جاوا اسکریپت asynchronous یا همان غیرهمزمان است. در حالی که جاوااسکریپت در یک نخ (thread ) و به صورت سینک اجرا می شود. البته این توانایی را دارد که توابع اسینکرون نظیر ایجکس ها (ajax) ها را- به کمک یه مفهوم که در خود دارد - به صورت آسینک اجرا کند. در پست بعدی به سراغ این مباحث خواهم رفت.