⊗jsPmTrTCL 451 of 505 menu

Vipima na Kupoteza Muktadha katika JavaScript

Wakati wa kutumia vipima katika vichakataji matukio tunakabiliwa na matatizo ya kupoteza muktadha. Hebu tuangalie kwa mfano.

Tuchukulie tuna kiingizio:

<input id="elem" value="text">

Tuchukulie kubofya kiingizio hiki kitafanya kazi anonimu na ndani ya kitendakazi hicho kianzisha kiima, kila sekunda kinachotoa kitu kwenye koni:

let elem = document.querySelector('#elem'); elem.addEventListener('click', function() { setInterval(function() { console.log('!!!'); // tunatoa kitu kwenye koni }, 1000); });

Kwa sasa kila kitu kinafanya kazi sawa. Lakini sasa tuchukulie tunataka kuonyesha kwenye koni value ya kiingizio chetu - tunakabiliwa na mshangao: kwenye koni kutaonyeshwa undefined:

elem.addEventListener('click', function() { setInterval(function() { console.log(this.value); // itaonyesha undefined }, 1000); });

Shida yote ni kwamba tunapata kitendakazi ndani ya kitendakazi: kuna kitendakazi cha nje cha anonimu, kinachoitwa kwa kubofya na cha ndani cha anonimu, ambacho kinaanzishwa na kiima. Katika kitendakazi cha nje this inaelekeza kwenye kiingizio, lakini kwa cha ndani - haifanyi. Kuna kupoteza muktadha.

Kwa nini inaonyesha undefined, na haitupi makosa kwenye koni, kama ilivyokuwa katika masomo yaliyopita? Kwa sababu this ndani ya kitendakazi, kinachoitwa kupitia setInterval, inaelekeza kwenye window.

Hii inamaanisha kuwa tunajaribu kusoma sifa value ya kitu window, kama hivi: window.value, na sifa kama hiyo haipo ndani yake, na tunapata undefined (sio makosa).

Turekebishe tatizo kwa kuanzisha self:

elem.addEventListener('click', function() { let self = this; setInterval(function() { console.log(self.value); }, 1000); });

Tuchukulie kuna msimbo kama huu:

<input type="button" id="elem" value="1"> let elem = document.querySelector('#elem'); elem.addEventListener('click', function() { setInterval(function() { this.value = Number(elem.value) + 1; }, 1000); });

Mwandishi wa msimbo alitaka, ili kubonyeza kitufe, thamani ya kitufe hicho kila sekunda iongezeke kwa 1. Hata hivyo, kubonyeza kitufe hakuna chochote kinachotokea. Rekebisha makosa ya mwandishi wa msimbo. Andika maandishi, ambayo wewe utatoa maelezo kwa mwandishi wa msimbo, kwa nini yalitokea makosa yake.

Kiswahili
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Tunatumia kuki kwa ajili ya uendeshaji wa tovuti, uchambuzi na ubinafsishaji. Usindikaji wa data unafanyika kulingana na Sera ya Faragha.
kubali yote sanidi kataa