⊗jsPmCxCL 435 of 505 menu

Gubitak konteksta u JavaScript-u

Recimo da imamo funkciju unutar funkcije. Hajde da spoljašnju funkciju nazovemo parent, a unutrašnju - child:

function parent() { function child() { } }

Iz prethodnih lekcija znate da će, ako postavite bilo koju promenljivu u spoljašnjoj funkciji - ona biti dostupna unutrašnjoj:

function parent() { let str = 'abcde'; function child() { console.log(str); // ispisaće 'abcde' } child(); // pozivamo unutrašnju funkciju } parent(); // pozivamo spoljašnju funkciju

Međutim, postoji nijansa: unutrašnja funkcija ima pristup svim promenljivim spoljašnje, ali ne ima pristup this. To znači: ako je spoljašnja funkcija vezana za neki DOM element, onda će this u njoj pokazivati na taj element, ali this unutrašnje funkcije - neće!

A na šta će onda pokazivati this unutrašnje funkcije? Odgovor: biće jednak undefined (u strogom režimu), jer funkcija nije vezana ni za šta.

Hajde da proverimo u praksi. Recimo da imamo input polje:

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

Povežimo za ovo input polje funkciju parent, koja će se pozivati kada input polje izgubi fokus:

"use strict"; let elem = document.querySelector('#elem'); elem.addEventListener('blur', parent); // Pozvaće se pri gubitku fokusa: function parent() { // ovde će biti neki kod function child() { // ovde će biti neki kod } child(); // pozivamo child funkciju }

Hajde da ispišemo sadržaj this u konzolu na dva mesta: unutar funkcije parent i unutar funkcije child:

"use strict"; let elem = document.querySelector('#elem'); elem.addEventListener('blur', parent); function parent() { console.log(this); // ispisaće referencu na naše input polje function child() { console.log(this); // ispisaće undefined } child(); }

Pokrenite ovaj kod, izgubite fokus input polja i pogledajte u konzolu - videćete da prvi console.log ispisuje u konzolu referencu na naše input polje, a drugi - prosto undefined. Ovakva situacija, kada this na za nas neočekivan način ne pokazuje na ono što nam je potrebno, naziva se gubitak konteksta.

Recimo da sada u jednoj i u drugoj funkciji ispisujemo value input polja. Odredite, šta će se ispisati u linijama koda, označenim komentarima:

"use strict"; let elem = document.querySelector('#elem'); elem.addEventListener('blur', parent); function parent() { console.log(this.value); // šta će ispisati? function child() { console.log(this.value); // šta će ispisati? } child(); }
Srpski
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Koristimo kolačiće za rad sajta, analitiku i personalizaciju. Obrada podataka se vrši u skladu sa Politikom privatnosti.
prihvati sve podesi odbij