Middle
Opowiedz o kontekście funkcji w JavaScript.
sobes.tech AI
Odpowiedź od AI
Kontekst wykonania funkcji (this) w JavaScript określa, jak funkcja jest wywoływana i jakie wartości są dostępne wewnątrz niej. Kontekst dynamicznie zmienia się w zależności od sposobu wywołania:
- Kontekst globalny: Poza funkcjami,
thisodnosi się do obiektu globalnego (windoww przeglądarce,globalw Node.js).// W przeglądarce console.log(this === window); // true // W Node.js console.log(this === global); // true - Kontekst funkcji:
- Standardowe wywołanie: W trybie nie-ścisłym,
thiswewnątrz funkcji odnosi się do obiektu globalnego (jeśli funkcja nie jest metodą obiektu). W trybie ścisłym ("use strict";)thisbędzieundefined.function showThis() { console.log(this); } showThis(); // W trybie nie-ścisłym: Obiekt globalny; W trybie ścisłym: undefined - Wywołanie jako metoda obiektu:
thisodnosi się do obiektu, do którego należy metoda.const user = { name: 'Alice', greet: function() { console.log("Cześć, nazywam się " + this.name); } }; user.greet(); // Cześć, nazywam się Alice - Przy użyciu
new(konstruktor): Tworzy nowy obiekt, który staje się wartościąthiswewnątrz funkcji konstruktora, i zwraca ten obiekt.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Jawne określenie kontekstu (
call,apply,bind):call(thisArg, arg1, arg2, ...): Wywołuje funkcję z określonymthisi argumentami wymienionymi osobno.apply(thisArg, [argsArray]): Wywołuje funkcję z określonymthisi argumentami w tablicy.bind(thisArg, arg1, arg2, ...): Zwraca nową funkcję, którejthisjest na stałe przypisane dothisArg, a argumenty są wstępnie powiązane.
function introduce(greeting, punctuation) { console.log(greeting + ", jestem " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Cześć", "!"); // Cześć, jestem Charlie! introduce.apply(person, ["Witaj", "."]); // Witaj, jestem Charlie. const boundIntroduce = introduce.bind(person, "Hej"); boundIntroduce("?"); // Hej, jestem Charlie?
- Standardowe wywołanie: W trybie nie-ścisłym,
- Funkcje strzałkowe: Nie mają własnego kontekstu
this. przechwytująthisz otaczającego zakresu leksykalnego, w którym zostały zdefiniowane.const obj = { name: 'David', sayLater: function() { // `this` tutaj odnosi się do `obj` setTimeout(() => { // `this` tutaj również odnosi się do `obj` (odziedziczone z `sayLater`) console.log("Później, jestem " + this.name); }, 1000); } }; obj.sayLater(); // Później, jestem David