Bazat e punës me kontekst në JavaScript

Le të themi se kemi një funksion func, brenda të cilit përdoret this:

javascriptfunction func() {
  console.log(this.value);
}

Çfarë tregon this në këtë funksion? Ne nuk e dimë. Dhe JavaScript nuk e di. Dhe vetë funksioni nuk e di. Kjo do të thotë, në momentin e krijimit të funksionit, ajo që this tregon nuk është e përcaktuar. Dhe do të përcaktohet vetëm kur ky funksion të thirret.

Le të themi se kemi një input:

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

Le ta lidhim këtë input me funksionin tonë func në mënyrë që ai të ekzekutohet kur inputi humb fokusin. Tani, në momentin e ekzekutimit të funksionit this do të tregojë tek inputi ynë:

javascriptlet elem = document.querySelector('#elem');

elem.addEventListener('blur', func);
function func() {
  console.log(this.value); // kur humbet fokusi do të shfaqet 'text'
}

Por mund të kemi jo një input, por disa:

html<input id="elem1" value="text1">
<input id="elem2" value="text2">

Dhe secilit prej këtyre inputeve mund t'ia lidhim funksionin tonë func. Në këtë rast, për elementin e parë, this në momentin e thirrjes së funksionit do të tregojë tek ai, dhe për të dytin - tek ai.

Në praktikë, kjo do të thotë se this brenda funksionit varet nga se në cilin prej inputeve kemi humbur fokusin:

javascriptlet elem1 = document.querySelector('#elem1');
elem1.addEventListener('blur', func);

let elem2 = document.querySelector('#elem2');
elem2.addEventListener('blur', func);

function func() {
  console.log(this.value); // do të shfaqë ose 'text1' ose 'text2'
}

Në përgjithësi, kjo veçori e this është shumë e përshtatshme - ne krijojmë vetëm një funksion dhe e lidhim atë me çdo numër inputesh. Nëse this nuk do të tregonte tek ai element, ku ndodhi ngjarja, atëherë ne nuk do të kishim mundur ta bënim këtë - do të duhej të krijonim për çdo input funksionin e vet me të njëjtin kod!