Hi everyone! I'm the author of code.mu :)
I'd love to chat with my non-Russian audience. I'm looking for your feedback on the site and the translation quality. Let's chat:)
⊗jsPmTrTCL 451 of 505 menu
◀ ▶

Timers och kontextförlust i JavaScript

När man använder timers i händelsehanterare väntar problem med kontextförlust på oss. Låt oss titta på ett exempel.

Låt oss säga att vi har en input:

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

Låt oss säga att vid ett klick på denna input triggas en anonym funktion och inuti denna funktion startas en timer som varje sekund skriver ut något i konsolen:

let elem = document.querySelector('#elem'); elem.addEventListener('click', function() { setInterval(function() { console.log('!!!'); // skriver ut något i konsolen }, 1000); });

Än så länge fungerar allt korrekt. Men låt oss nu säga att vi vill skriva ut value från vår input i konsolen - vi väntar en överraskning: i konsolen kommer undefined att skrivas ut:

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

Hela saken är att vi får en funktion i en funktion: det finns en extern anonym funktion, som anropas vid klick, och en intern anonym funktion, som triggas av timern. I den externa funktionen pekar this på input, men i den interna - inte. Det finns en kontextförlust.

Varför skrivs undefined ut, och inte ett fel i konsolen, som det var i tidigare lektioner? Eftersom this inuti funktionen som anropas via setInterval, pekar på window.

Det betyder att vi försöker läsa egenskapen value från objektet window, så här: window.value, och det finns ingen sådan egenskap i det, och vi får undefined (inget fel).

Låt oss åtgärda problemet genom att introducera self:

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

Låt oss säga att vi har denna kod:

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

Kodens författare ville att när knappen klickades, ska värdet på denna knapp ökas med 1 varje sekund. Men när man klickar på knappen händer ingenting alls. Råtta författarens fel. Skriv en text där du ger en förklaring till kodens författare om varför felet uppstod.

← →
↑
Svenska▼
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Vi använder kakor för webbplatsens funktion, analys och personalisering. Behandling av data sker i enlighet med Integritetspolicyn.
acceptera alla anpassa avvisa