Middle
V čem se šipkové funkce liší od běžných funkcí z hlediska nutnosti použití metody bind?
sobes.tech AI
Odpověď od AI
Šipkové funkce nem mají vlastní kontext this. Zachytávají this z okolního prostředí (lexikálního prostředí).
Obvyklé funkce definují svůj this v závislosti na způsobu volání:
- V globálním kontextu (
windowneboglobal). - Jako metoda objektu (
thisodkazuje na objekt). - Jako konstruktor (
thisodkazuje na novou instanci). - Pomocí
call,applynebobind(thisje nastaveno explicitně).
Protože šipkové funkce nemají vlastní this, volání bind na šipkové funkci nedává smysl a nezmění lexikálně vázaný this. Pokud se pokusíte volat bind na šipkové funkci, jednoduše se vrátí sama.
Příklad:
// Normální funkce
const normalFunc = function() {
console.log(this.name);
};
const obj1 = { jméno: 'Objekt 1', metoda: normalFunc };
const obj2 = { jméno: 'Objekt 2' };
obj1.metoda(); // Výstup: Objekt 1
const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Výstup: Objekt 2 (this byl úspěšně změněn)
// Šipková funkce
const arrowFunc = () => {
console.log(this.name);
};
const obj3 = { jméno: 'Objekt 3' };
// ArrowFunc zachytává `this` z okolního prostředí (v tomto případě globální objekt)
arrowFunc(); // Výstup: undefined (pravděpodobně, protože `this` neobsahuje `name`)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Výstup: undefined (`this` nezměněno, bind neměl efekt)
// Příklad s zachycením `this`
const person = {
jméno: 'Alice',
greet: function() {
// Tady `this` odkazuje na `person`
const greetLater = () => {
// Tady `this` je zachyceno z vnějšího kontextu `greet`, tedy také na `person`
console.log(`Ahoj, ${this.jméno}!`);
};
greetLater();
}
};
person.greet(); // Výstup: Ahoj, Alice!
Shrnutí: metoda bind je nutná pro normální funkce, aby explicitně nastavila jejich kontext this, zatímco u šipkových funkcí je nadbytečná, protože jejich this je určeno lexikálně a nelze jej změnit pomocí bind.