تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ emad ta
خلاصه مطالب اکما اسکریپت 6
جامعه جاوا اسکریپت ایجاد شده در ۲۳ فروردین ۱۴۰۰

تعریف Scope :  محدوده ای که یک متغیر یا یک تابع قابل دسترسی هستش و ما میتونیم بیایم و از اون استفاده بکنیم 

به طور کلی  به دو دسته local و global تقسیم بندی می‌شوند 

 

نکته : متغیر هایی که به صورت گلوبال تعریف می‌شوند رو ما می‌تونیم به وسیله آبجکت window بیایم و از اون‌ها دسترسی بگیریم و استفاده بکنیم

 

تعریف Hoisted : وقتی ما میایم و یک تابع به صورت فانکشن استراکتور تعریف میکنیم جاوااسکریگت موقع اجرا میاد واون هارو در اول برنامه تعریف میکنه و ما می‌تونیم بیایم و قبل تعریف توابع از اون‌ها استفاده بکنیم علاوه بر این جور توابع متغیرهایی که با var تعریف می‌شوند هم همین طور هستند

 

نکته : متغیر هایی که با var تعریف می‌شوند دو تا مرحله دارند یک declaration و دومی assignment که اولی همون اول میاد و در بالای همه کد‌ها اتفاق می‌افتد ولی دومی در جایی که تعریف کردیم و مقدار دهیش کردیم میاد و اتفاق می‌افتد

 

کلمه کلیدی let : یک کلمه کلیدی برای تعریف متغیر‌ها هستش ولی به صورت بلاک اسکوپ هستش 

 

تفاوت‌های let و var 

1 - در حلقه‌ها با let متغیر به Scope  حلقه محدود می‌شود

2 - در متغیر‌های تعریف شده با let  در حالت گلوبال اسکوپ در window در دسترس نیستند

3 - اجازه تعریف مجدد متغیر تعریف شده با let  را درهمان اسکوپ نداریم 

4 - متغیر‌های تعریف شده با let  امکان hoisted شدن ندارند

مفاهیم کلاس برای شی گرایی :  ساختار کار کردن با اون‌ها خیلی شبیه به کانستراکتور آبجکت‌ها هستش و نوع آن‌ها تابع هستند و تمام توابعی که در آن میایم و ایجاد میکنیم میاد و به پروتوتایپ آن می‌چسبد 

 

تفاوت کلاس با constructor objects : 

 

1 -  یک شی از یک کلاس را حتما  باید با استفاده از کلمه کلیدی new ایجاد کرد

2 - متد‌ها در کلاس به صورت non-enumerable هستند و در نتیجه  در for..in ظاهر نمی‌شوند

3-  کلاس‌ها همیشه در حالت strict mode هستند 

 

نکته : ما برای تعریف متد در داخل کلاس‌ها لازم نیست که بیایم و از کلمه فانکشن استفاده کنیم در داخل متد هامون هم ما میتونیم با استفاده از  this به اجزای خود کلاس‌ها دسترسی داشته باشیم اما اگر این توابع مربوط به کلاس رو در داخل جایی دیگه به صورت کال بک استفاده کنیم به مشکل میخوریم  و اون this رو دیگه دنبال نمیکنه نمونه کد برای این مشکل 

class animal {
  constructor(){
    this.name = "cat";
  }
  runnig(){
    console.log(this.name);
    console.log(' ... runnig ...')
  }
}
let myAnimal = new animal();
console.log(myAnimal)
setTimeout(myAnimal.running,1000);
که می‌بینیم کلن از  نام میاد و صرف نةر میکند

چند تا روش برای حل این مشکل وجود دارد که اولی این هستش که ما این تابع رو به صورت کال بک ارسالش نکنیم بلکه بیایم و به صورت invoke شده از اون استفاده بکنیم و زیاد جالب نیست و ممکنه بعضی جاها گیر کنیم 

setTimeout(myAnimal.running(),1000);

روش دوم این هست که موقع تعریف توابع در کلاس هامون بیایم و به صورن arrow function  اون رو تعریف کنیم که این تابع خودش this ندارد و میاد this محیط اطرافش رو میگیره و یک اسکوپ متفاوت نمیشه همچنین ما وقتی میایم و یک تابع رو به صورت اررو تعریف میکنیم این تابع دیگه جزو پروتو نمیره بلکه میاد و میشه جزو اصل کلاس امون و وارد  ارث بری‌ها نمیشه در حالی که به صورت سنتی وارد پروتوتایپ 

 

روش سوم حالت binding هستش که برای این کار هم چند حالت وجود دارد یکی این که در جایی که تابع صدا زدیم بیایم و bind بکنیم اون شی که اون رو صدا زده

setTimeout(myAnimal.running.binding(myAnimal),1000);

و حالت دوم برای  مفهوم  binding 

setTimeout(()=> myAnimal.runnig(),1000);

و حالت سوم برای این مفهوم باید در خود کانستراکتور کلاس بیایم و بنویسیم

this.runnig = this.runnig.bind(this); که میاد و اون رو به خود کلاس می‌چسبوند

در این حالت بالا هم در پروتوتایپ هست و هم در خود کلاس هستش

emad ta ۲۴ فروردین ۱۴۰۰، ۰۹:۵۶