JavaScript
JavaScript

JavaScript 'this' - jedno z nejvíce nepochopených klíčových slov

Patrik KeblušekPatrik Keblušek,

JavaScript je velmi oblíbený jazyk, který nemá tak striktní pravidla jako ostatní programovací jazyky. Klíčové slovo this patří mezi vývojáři mezi jeho nejvíce nepochopené koncepty. Po tomto článku vám už this vrásky dělat nebude.

Hodnota this je závislá na tom, kde ho voláme. JavaScript spustí každý kód v nějakém kontextu objektu, do kterého metoda patří. Když tedy v metodě zavoláme this, budeme se odkazovat na kontext, ze kterého byl kód spuštěn. Kontext this může být globální (odkazuje na globální objekt, který se provádí v rámci celé aplikace, případně je součástí funkce nebo metody. Pojďme se podívat na příklady.

this v globálním kontextu

console.log(this)

// odkáže nás na globální objekt window

this v kontextu funkce

function helloWorld() {
   console.log(this);
}

helloWorld();

//this bude odkazovat na globální objekt window

Pokud ale voláme funkci, která je součástí jiného objektu, pak this nás bude odkazovat na daný objekt.

const test = {
   name: 'Fordevs',
   helloWorld() {
      console.log(this);
   }
}

test.helloWorld();

// this odkazuje na objekt test
object1 = {
   foo: function() {
      console.log(this);
   },
   value: 'A',
};

object2 = {
   foo: object1.foo,
   value: 'B',
};

object1.foo();  // this se odkazuje na object1
object2.foo();  // this se odkazuje na object2

Pozor na use strict. V případě, že je hodnota metody primitivní (string, number, bigint, boolean, undefined, symbol, null), tak this bude také primitivní hodnotou. Ale pouze za použití use strict.

function strictFunction() {
   'use strict'; 
   console.log(this);
}

strictFunction();

// vypíše nám undefined

this v arrow functions

Arrow funkce si nebindují svůj vlastní this kontext. Místo toho, this patří ke scopu rodiče, což je nazýváno jako „lexical scoping“. To dělá na jedné straně arrow funkce skvělé, na druhé straně mohou nadělat problémy.

const myFunction = () => {
   console.log(this);
};

myFunction();

// this odkazuje na global object window
const myObject = {
   myMethod: () => {
      console.log(this);
   }
};

myObject.myMethod();

// this bude odkazovat na globální window object

this v kontextu eventu

const button = document.querySelector('button');

button.addEventListener('click', function() {
   console.log(this);
});

// this odkazuje na element, který vyvolal event

Použijeme-li arrow funkci, tak nás bude odkazovat na globální objekt.

const button = document.querySelector('button');

button.addEventListener('click', () => {
   console.log(this);
});

// this odkazuje na window object

this a klíčové slovo new

V JavaScriptu klíčové slovo new vytvoří nový objekt. Uvnitř funkce, je tda this nastaveno na nový objekt. Pojďme se podívat na příklad.

function printName(name) {
   this.name = name;
   
   console.log(this.name);
}

new printName('fordevs');

bindovanie this na vlastní kontext

V JavaScript lze říci this kam chceme, aby ukazoval, a to pomocí bind(). Z vyšších částí článku už víme, že když napíšeme jednoduchou funkci, ve které pouze consol.logujeme this a zavoláme ji z window objektu, tak bude odkazovat na globální object. Je však možné, aby nám this odkazovalo na jiný object.

function myMethod() { 
   console.log(this);
};

const myObject = {};

const myMethodBound = myMethod.bind(myObject);

// this bude odkazovat na object "myObject"

Závěr

This je v JavaScript dvousečná zbraň, pokud mu rozumíte, tak vám umí při programování hodně pomoci. To ale platí i naopak. Pokud nevíte kam směřuje kontext this, tak vám umí nadělat pěkné problémy.

Věřím, že vám je už použití this jasnější, pokud chce zajít ještě více do detailů, tak doporučuji rozsáhlý článek na MDN.