Kas yra kontekstas funkcijoje?
sobes.tech AI
Atsakymas iš AI
JavaScript funkcijoje (this) kontekstas nustatomas pagal tai, kaip funkcija buvo iškviesta, o ne pagal tai, kur ji buvo deklaruota. Jis nurodo į objektą, kuriam funkcija priklauso arba kuris ją iškviečia.
Konteksto nustatymo būdai:
-
Pasaulinis kontekstas: Funkcijos išorėje arba jei funkcija iškviečiama be aiškaus objekto (
thisbus globalus objektaswindownaršyklėje,globalNode.js, arbaundefinedstrict režimu).// Naršyklėje console.log(this === window); // true function showContext() { console.log(this); } showContext(); // window -
Objekto kontekstas (metodas): Jei funkcija iškviečiama kaip objekto metodas (
obj.method()),thisfunkcijos viduje nurodo į tą objektą.const user = { name: 'Alice', greet: function() { console.log(`Sveiki, aš esu ${this.name}`); } }; user.greet(); // Sveiki, aš esu Alice -
Konstruktoriaus kontekstas: Kai funkcija iškviečiama su žodžiu
new(new MyClass()), sukuriamas naujas objektas, irthiskonstruktoriuje nurodo į tą naują objektą.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob -
Aiškus konteksto nurodymas: Metodai
call,applyirbindleidžia aiškiai nustatytithisreikšmę funkcijos iškvietimo metu.call(thisArg, arg1, arg2, ...): Iškviečia funkciją su nurodytuthisir argumentais, perduodamais atskirai.apply(thisArg, [argsArray]): Iškviečia funkciją su nurodytuthisir argumentais, perduodamais kaip masyvas.bind(thisArg, arg1, arg2, ...): Grąžina naują funkciją, kuriojethisyra fiksuotas į nurodytą reikšmę.
function displayInfo(age) { console.log(`${this.name} yra ${age} metų.`); } const person = { name: 'Charlie' }; displayInfo.call(person, 30); // Charlie yra 30 metų. displayInfo.apply(person, [35]); // Charlie yra 35 metų. const bondedDisplayInfo = displayInfo.bind(person, 40); bondedDisplayInfo(); // Charlie yra 40 metų. -
Raketinės funkcijos: Raketinės funkcijos neturi savo
this. Jos paveldėsthisiš leksikalinės aplinkos (konteksto, kur jos buvo apibrėžtos).const anotherUser = { name: 'David', sayHello: function() { const innerArrow = () => { console.log(`Sveiki iš rodyklės, ${this.name}`); }; innerArrow(); // `this` čia yra anotherUser, paveldėtas iš sayHello }, sayHelloBad: () => { // bloga praktika objektų metodams console.log(`Sveiki iš rodyklės, ${this.name}`); } }; anotherUser.sayHello(); // Sveiki iš rodyklės, David // Naršyklėje, išskyrus strict režimą anotherUser.sayHelloBad(); // Sveiki iš rodyklės, undefined (this - window)
Konteksto supratimas yra labai svarbus teisingai dirbant su objektais, metodais ir įvykių apdorojėjais JavaScript'e.