⊗jsPmTrTCL 451 of 505 menu

Թայմերներ և կոնտեքստի կորուստ JavaScript-ում

Թայմերներ օգտագործելիս իրադարձությունների մշակիչներում մեզ սպասվում են կոնտեքստի կորստի խնդիրներ։ Եկեք նայենք օրինակով։

Ենթադրենք ունենք ինպուտ։

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

Ենթադրենք այս ինպուտի վրա կլիկի ժամանակ աշխատում է անանուն ֆունկցիա, և այդ ֆունկցիայի ներսում գործարկվում է թայմեր, որը ամեն վայրկյան տպում է ինչ-որ բան կոնսոլում։

let elem = document.querySelector('#elem'); elem.addEventListener('click', function() { setInterval(function() { console.log('!!!'); // ինչ-որ բան տպում ենք կոնսոլում }, 1000); });

Մինչ այժմ ամեն ինչ ճիշտ է աշխատում։ Բայց եկեք այժմ ենթադրենք, որ ուզում ենք տպել կոնսոլում value մեր ինպուտի - մեզ սպասվում է անակնկալ. կոնսոլում կտպվի undefined։

elem.addEventListener('click', function() { setInterval(function() { console.log(this.value); // կտպվի undefined }, 1000); });

Ամբողջ բանն այն է, որ ստացվում է ֆունկցիա ֆունկցիայի ներսում. կա արտաքին անանուն ֆունկցիա, որը կանչվում է կլիկի ժամանակ, և ներքին անանուն ֆունկցիա, որը գործարկում է թայմերը։ Արտաքին ֆունկցիայում this-ը ցույց է տալիս ինպուտին, բայց ներքինում՝ ոչ։ Տեղի է ունենում կոնտեքստի կորուստ։

Ինչու՞ է տպվում undefined, և չենք ստանում սխալ կոնսոլում, ինչպես դա եղել է նախորդ դասերում։ Քանի որ this-ը ֆունկցիայի ներսում, որը կանչվում է setInterval-ի միջոցով, ցույց է տալիս window-ին։

Սա նշանակում է, որ մենք փորձում ենք կարդալ value հատկությունը window օբյեկտից, ահա այսպես. window.value, իսկ նրա մեջ այդպիսի հատկություն չկա, և մենք ստանում ենք undefined (ոչ թե սխալ)։

Ուղղենք խնդիրը self-ի ներմուծմամբ։

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

Ենթադրենք տրված է այսպիսի կոդ։

<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); });

Կոդի հեղինակը ցանկանում էր, որ կոճակի վրա սեղմելիս այդ կոճակի արժեքը ամեն վայրկյան ավելանա 1-ով։ Սակայն, կոճակի վրա սեղմելիս ընդհանրապես ոչինչ չի կատարվում։ Ուղղեք հեղինակի սխալը։ Գրեք տեքստ, որում դուք բացատրություն կտաք կոդի հեղինակին, թե ինչու առաջացավ նրա սխալը։

Հայերեն
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Մենք օգտագործում ենք cookie-ներ կայքի աշխատանքի, վերլուծության և անհատականացման համար։ Տվյալների մշակումը կատարվում է համաձայն Գաղտնիության քաղաքականության։
ընդունել բոլորը կարգավորել մերժել