Middle
Pověz o kontextu funkcí v JavaScriptu.
sobes.tech AI
Odpověď od AI
Kontext vykonání funkce (this) v JavaScriptu určuje, jak je funkce volána a jaké hodnoty jsou uvnitř ní dostupné. Kontext se dynamicky mění v závislosti na způsobu volání:
- Globální kontext: Mimo funkce,
thisodkazuje na globální objekt (windowv prohlížeči,globalv Node.js).// V prohlížeči console.log(this === window); // true // V Node.js console.log(this === global); // true - Kontext funkce:
- Standardní volání: V ne-strict módu
thisodkazuje na globální objekt (pokud funkce není metodou objektu). V strict módu ("use strict";) budethisundefined.function showThis() { console.log(this); } showThis(); // V ne-strict módu: Globální objekt; V strict: undefined - Volání jako metoda objektu:
thisodkazuje na objekt, jehož je metoda součástí.
const user = { name: 'Alice', greet: function() { console.log("Hello, my name is " + this.name); } }; user.greet(); // Hello, my name is Alice - Volání s
new(konstruktor):- Vytvoří nový objekt, který se stává hodnotou
thisuvnitř konstruktorové funkce, a tento objekt vrací.
function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Vytvoří nový objekt, který se stává hodnotou
- Explicitní určení kontextu (
call,apply,bind):call(thisArg, arg1, arg2, ...): Volá funkci s danýmthisa argumenty uvedenými zvlášť.apply(thisArg, [argsArray]): Volá funkci s danýmthisa argumenty v poli.bind(thisArg, arg1, arg2, ...): Vrací novou funkci, jejížthisje navždy přiřazen kthisArga argumentům.
function introduce(greeting, punctuation) { console.log(greeting + ", I am " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Hi", "!"); // Hi, I am Charlie! introduce.apply(person, ["Hello", "."]); // Hello, I am Charlie. const boundIntroduce = introduce.bind(person, "Hey"); boundIntroduce("?"); // Hey, I am Charlie?
- Standardní volání: V ne-strict módu
- Šipkové funkce: Nemají vlastní
this. Zachytávajíthisz okolního lexikálního prostředí, ve kterém byly definovány.const obj = { name: 'David', sayLater: function() { // `this` zde odkazuje na `obj` setTimeout(() => { // `this` zde také odkazuje na `obj` (zděděno z `sayLater`) console.log("Later, I am " + this.name); }, 1000); } }; obj.sayLater(); // Later, I am David