Mohammad Bohluli
Mohammad Bohluli
خواندن ۳ دقیقه·۱۰ ماه پیش

اندر احوالات جاوااسکریپت (قسمت سوم)

سلام سلام

رسیدم به مبحث جذاب scoping توی زبان شیرین javascript 😎

اگه مقاله قبل رو خونده باشید گفتم Execution Context سه تا مورد داره که یکی از اون سه مورد یعنی scope مبحث اصلی این قسمت هستش

اسکوپ یعنی اون محدوده ای که variable های ما توی اون تعریف شدن و خارج از اون محدوده قابل دسترسی نیستن.

پس وقتی پرسیدن اسکوپ یا محدوده یک متغییر کجاست ؟؟؟ 🤨 باید بگیم محدوده ای از کد ما که اون متغییر بهش دسترسی داره . اوکی؟

حالا ما 3️⃣ نوع اسکوپ داریم :

1️⃣ اولیش میشه Global Scope :

  • به کجا میگن گلوبال اسکوپ ؟؟؟ هرجایی که خارج از function و block باشه (منظور از بلاک اینه 👈🏻 {}) یعنی بی در و پیکرترین اسکوپ ما همینه چون متغییرهاش رو همه بهش دسترسی دارن


2️⃣ دومین اسکوپ ما Function Scope (Local Scope هم بهش میگن) :

  • توی این نوع اسکوپ متغییر ها فقط و فقط در داخل function قابل دسترسی هستن
  • متغییر هایی که با var خدا بیامرز (دیگه استفادش نکنید ) تعریف میشن جز این دسته اسکوپ هستن
  • توی مثال بالا متغییر myName فقط توی تابع قابل دسترس هست (vscode هم کم رنگش کرده) و اگه خارج از تابع بخوایی بهش دسترسی پیدا کنی reference error میگیری در واقع میگه من متغییری به اسم myName ندارم، چیزی زدی؟😰


3️⃣ آخرین اسکوپ ما Block Scope هستش که توی ES6 معرفی شد :

  • توی این اسکوپ متغییر ها فقط و فقط توی بلاک { } خودشون قابل دسترسی هستن . بلاک مثل چی ؟ مثل if یا for یا switch


  • دقت کنید که let و const هم بلاک اسکوپ هستن
  • توی حالت strict mode خود function ها هم بلاک اسکوپ هستن، یعنی چی؟🤔 یعنی اگه تابعی رو داخل یه بلاک قرار دادی و strict mode هم روشن کردی نمیتونی خارج اون بلاک بهش دسترسی داشته باشی مثل مثال زیر
پس یکی از تفاوت های var با let , const رو زیر پوستی یاد گرفتین، که اون تفاوتم میشه ؟ اسکوپشون
تفاوت های دیگشون رو قسمت های بعدی میگم، آسیاب به نوبت


نکته بعدی مکانیزمی به اسم scope chain هست یعنی زنجیره اسکوپی، حالا این زنجیره اسکوپی میخواد چی رو برسونه ؟؟؟ بریم با مثال یادش بگیریم

تصویر بالارو ببینید فرض کنید میخواییم به اون myName دسترسی پیدا کنیم خب سوال اینجاست که myName که توی اسکوپ تابع second تعریف نشده که پس باید ارور بده دیگه

اما نه ✋🏻!!! چون جاوااسکریپت باهوشه، اول توی همون اسکوپ که متغییر myName صدا زده شده جست و جو میکنه میبینه ای دل غافل چیزی نیست که، میره اسکوپ بالاترش یعنی تابع first رو میگرده میبینه ای بابا اینجام نیستش پس بازم میره بالاتر (یعنی اسکوپ گلوبال) میبینه خط اول تعریف شده پس مقدار myName رو میزاره jonas پس به کل این فرایند جست و از داخل به بیرون برای دسترسی به یک متغییر رو میگن scope chain

درواقع انقدر به اسکوپ بالاتر میره تا به تهش برسه پیداش کنه، در این بچه پیگیریه

چندتا نکته حواست باشه :

☝🏻فرایند جست و جو از داخل به بیرونه مثل یه خیابون یک طرفه اس و برعکسش صدق نمیکنه
☝🏻جست و جو نسبت به بلاک بالاتر صورت میگیره نه بلاک همسایه یعنی جاوااسکریپت نمیاد برای myName اون بلاک if رو بگرده بلکه بلاک بالاترش که first هست رو میگرده اون باکس بنفش و زرد هم داره این موضوع رو نشون میده
☝🏻 دقت کنید برای جست و جو یک اسکوپ جاوااسکریپت به ترتیب محل تعریف اسکوپ ها و بلاک ها نگاه میکنه، کاری نداره که تابع به ترتیب صدا زده شده باشه (برعکس Execution Context مقاله قبل که با صدا زدن تابع کار میکرد)
☝🏻 توی scope chain تمام اسکوپ ها به متغییر های بیرونی خودشون دسترسی دارن

امیدوارم به دردتون خورده باشه توی قسمت بعد میریم اون بالا بالا ها تا Hoisting رو یاد بگیریم و طرز کارشو بفهمیم

هرجا متوجه نشدین یا من اشتباه گفته بودم کامنت بزارید
موفق باشید ❤️


جاوااسکریپتبرنامه نویسیscopejavascript
علاقمند به تکونولوژی و هرچی که بهش مربوطه، کانال تلگرام LearnByLearn@
شاید از این پست‌ها خوشتان بیاید