خلاصه مطالب اکما اسکریپت 6

پرسیده شده
فعالیت 1106 روز پیش
دیده شده 436 بار
1

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

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

 

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

 

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

 

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

 

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

 

تفاوت های let و var 

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

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

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

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

فایل پیوست

emad ta
emad ta

23 فروردین 00

0
حذف شده

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

 

تفاوت کلاس با 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

توسط

emad ta

24 فروردین 00