JavaScript'da this kalit so'zi, uning 4 ta asosiy holati, oddiy funksiyalar va arrow function farqi, call, apply va bind orqali boshqarish hamda amaliy mashq va testlar.
this — JavaScript'dagi eng ko'p chalkashtiriluvchi tushunchalardan biri, chunki uning qiymati qayerda yozilganiga emas, balki qanday chaqirilganiga bog'liq. Bu boshqa ko'plab dasturlash tillaridan farq qiladi, shuning uchun batafsil o'rganamiz.
this — functionni chaqirayotgan object'ga ishora qiluvchi maxsus kalit so'z.
Chunki thisning qiymati 4 xil holatda 4 xil bo'lishi mumkin, va buni aniqlash uchun "functionning yozilgan joyi"ga emas, "functionning qanday chaqirilishiga" qarash kerak.
🪞 thisni oyna deb tasavvur qiling — oyna har doim "kim oldida turibdi" o'shani aks ettiradi. Xuddi shunday, this "function kim tomonidan chaqirilyapti" o'shani aks ettiradi.
Agar function object'ning methodi sifatida chaqirilsa, this — o'sha object'ga ishora qiladi.
script.jsJavaScriptlet person = {name: "Ali",greet: function () {console.log(this.name);}};person.greet(); // "Ali"
Explanation
greet() — person orqali chaqirilgani uchun, this — personga ishora qiladi.
Agar function hech qanday object orqali emas, mustaqil chaqirilsa, this — global object'ga ishora qiladi (browser'da window), yoki strict modeda undefined bo'ladi.
script.jsJavaScriptfunction showThis() {console.log(this);}showThis(); // window (yoki undefined, strict mode'da)
⚠️ Common Mistake
Method ichidan oddiy function chaqirish — thisni "yo'qotadi":
script.jsJavaScriptlet person = {name: "Ali",greet: function () {function inner() {console.log(this.name); // undefined!}inner();}};person.greet();
Nima uchun? inner() — person orqali emas, mustaqil chaqirilyapti, shuning uchun uning thisi personga emas, global object'ga (yoki undefinedga) ishora qiladi.
new bilan chaqirilganda, this — yangi yaratilayotgan objectga ishora qiladi.
script.jsJavaScriptfunction Person(name) {this.name = name;}let user = new Person("Vali");console.log(user.name); // "Vali"
Explanation
new Person("Vali") chaqirilganda, JavaScript avtomatik ravishda bo'sh object yaratadi va thisni o'sha object'ga bog'laydi. Bu — Chapter 22'da (Classes) chuqurroq o'rganiladi.
Bu — eng ko'p chalkashtiriluvchi holat. Arrow function o'zining thisiga ega emas — u thisni tashqi (uni o'rab turgan) scope'dan meros oladi (lexical this deb ataladi).
script.jsJavaScriptlet person = {name: "Ali",greet: function () {let inner = () => {console.log(this.name);};inner();}};person.greet(); // "Ali"
Explanation
Oddiy function'dan farqli o'laroq (Holat 2'da ko'rganimizdek), arrow function inner o'zining thisini yaratmaydi, balki uni o'rab turgan greet functionining thisidan "meros" oladi. greet() — person orqali chaqirilgani uchun, uning thisi person, shuning uchun inner ham xuddi shu thisni ko'radi.
code.textTEXTperson.greet() → this = person│└── inner = () => { this.name }(o'z this'i yo'q, greet'dan meros oladi)→ this hali ham person
🔥 Important
Aynan shu xususiyat tufayli, arrow function'lar callback sifatida (masalan, setTimeout, event handler ichida) juda foydali — chunki ular tashqi thisni "yo'qotmaydi".
script.jsJavaScriptlet timer = {seconds: 0,start: function () {setInterval(function () {this.seconds++; // ❌ this — window, xato!console.log(this.seconds); // NaN}, 1000);}};
script.jsJavaScriptlet timer = {seconds: 0,start: function () {setInterval(() => {this.seconds++; // ✅ this — timer, to'g'ri!console.log(this.seconds); // 1, 2, 3...}, 1000);}};
Explanation
Birinchi misolda, setIntervalga berilgan oddiy function o'zining thisini yaratadi (bu holatda windowga ishora qiladi), shuning uchun this.seconds ishlamaydi. Ikkinchi misolda esa, arrow function start methodining thisini (ya'ni timerni) meros oladi, shuning uchun to'g'ri ishlaydi.
Ba'zida thisning qanday chaqirilishidan qat'i nazar, uni qo'lda "majburiy" belgilash kerak bo'ladi. Buning uchun 3 ta metod bor.
| Metod | Vazifasi | Chaqirish shakli |
|---|---|---|
call() | Functionni darhol chaqiradi, argumentlar alohida-alohida | fn.call(obj, arg1, arg2) |
apply() | Functionni darhol chaqiradi, argumentlar array shaklida | fn.apply(obj, [arg1, arg2]) |
bind() | Functionning yangi versiyasini qaytaradi (darhol chaqirmaydi) | let newFn = fn.bind(obj) |
script.jsJavaScriptfunction introduce(city) {console.log(`Men ${this.name}man, ${city}dan`);}let person = { name: "Aziz" };introduce.call(person, "Toshkent"); // "Men Azizman, Toshkentdan"introduce.apply(person, ["Buxoro"]); // "Men Azizman, Buxorodan"let boundIntroduce = introduce.bind(person);boundIntroduce("Xiva"); // "Men Azizman, Xivadan"
Har uchala metod ham introduce function ichidagi thisni majburan personga bog'laydi, garchi introduce personning methodi bo'lmasa ham.
💡 Key Idea
bind() ayniqsa foydali, chunki u kelajakda chaqirish uchun "tayyor" function qaytaradi — bu ko'pincha event handler'larda ishlatiladi.
Task:
car nomli object yarating, unda brand propertysi va showBrand methodi bo'lsin, method this.brandni chiqarsin.
Required Concepts:
this (Holat 1)console.log(this.brand) yozing.Task:
Quyidagi kodni arrow function yordamida tuzating, shunda this.name to'g'ri ishlasin:
script.jsJavaScriptlet user = {name: "Nodira",greetLater: function () {setTimeout(function () {console.log("Salom, " + this.name);}, 1000);}};user.greetLater(); // "Salom, undefined" — xato
Required Concepts:
this (Holat 4)setTimeoutga berilgan oddiy functionni arrow functionga almashtiring.Task:
introduce(greeting) nomli mustaqil function yozing, u this.name va berilgan greetingni birlashtirib chiqarsin. Keyin uni call, apply va bind orqali uchta xil object (person1, person2, person3) bilan ishlating.
Required Concepts:
call, apply, bindscript.jsJavaScriptlet obj = {value: 42,getValue: function () {return this.value;}};let extractedFunction = obj.getValue;console.log(obj.getValue());console.log(extractedFunction());
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 42 undefined (yoki xatolik, strict mode'da)Why?
obj.getValue() — obj orqali chaqirilgani uchun this — objga ishora qiladi, natija 42.
extractedFunction() esa — function objdan "ajratib olingan" va mustaqil chaqirilyapti, shuning uchun this endi objga emas, global object'ga (yoki undefinedga) ishora qiladi. Bu — thisning "qanday chaqirilishiga bog'liqligi"ning yorqin misoli.
Quyidagi kodda muammo bor:
script.jsJavaScriptlet button = {label: "Bosish",clicks: 0,handleClick: function () {setTimeout(function () {this.clicks++;console.log(this.label + ": " + this.clicks);}, 500);}};button.handleClick();
Your Task:
Yechim 1 — Arrow function:
script.jsJavaScripthandleClick: function () {setTimeout(() => {this.clicks++;console.log(this.label + ": " + this.clicks);}, 500);}
Yechim 2 — bind:
</details>script.jsJavaScripthandleClick: function () {setTimeout(function () {this.clicks++;console.log(this.label + ": " + this.clicks);}.bind(this), 500);}
thisning qiymati function qanday chaqirilishiga bog'liq, qayerda yozilganiga emas.new bilan, arrow function ichida.thisni tashqi scope'dan meros oladi (lexical this).call, apply, bind — thisni qo'lda boshqarish uchun ishlatiladi.this — dinamik, chaqirish usuliga qarab o'zgaradi.this "yo'qoladi" — buning yechimi arrow function.thisni saqlab qolish uchun juda foydali.bind() — kelajakda ishlatish uchun thisi "qulflangan" function yaratadi.thisni yo'qotadi.script.jsJavaScriptobj.method(); // this = objstandalone(); // this = window/undefinednew Constructor(); // this = yangi object() => {} // this = tashqi scope'dan merosfn.call(obj, a, b);fn.apply(obj, [a, b]);let bound = fn.bind(obj);
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: