No kurienes nāk funkcijas konteksts JavaScript?
sobes.tech AI
Atbilde no AI
Izpildes konteksts (vai this) JavaScript tiek noteikts izsaukšanas brīdī, nevis tās deklarēšanas brīdī. Tā vērtību ietekmē šādi faktori:
-
Globālais konteksts: Ārpus funkcijām
thisatsaucas uz globālo objektu (pārlūkprogrammāwindow, Node.jsglobal). Stingrā režīmā ('use strict')thisšajā gadījumā būsundefined.// Pārlūkprogrammā console.log(this); // window // Node.js console.log(this); // global -
Objekta metodes izsaukums: Ja funkcija tiek izsaukta kā objekta metode (caur punktu),
thisatsaucas uz šo objektu.const obj = { name: 'Obj', method: function() { console.log(this.name); } }; obj.method(); // Obj -
"Parasta" funkcijas izsaukums: Vienkāršā funkcijas izsaukuma gadījumā (ne kā metode)
thisneitrālā režīmā atsaucas uz globālo objektu. Stingrā režīmāthisbūsundefined.function greet() { console.log(this); } greet(); // window (neitrālā režīmā) vai undefined (stingrā režīmā) -
Konstruktors (ar
new): Kad funkcija tiek izsaukta ar atslēgvārdunew, tā darbojas kā konstruktors.thisfunkcijas iekšienē atsaucas uz jauno, tikko izveidoto objekta instanci.function Person(name) { this.name = name; } const person1 = new Person('Alice'); console.log(person1.name); // Alice -
Metodes
call,apply,bind: Šīs metodes tieši ļauj iestatītthisvērtību funkcijai.callunapplyizsauc funkciju uzreiz, nododotthiskā pirmo argumentu.callpieņem pārējos argumentus atsevišķi, betapply– kā masīvu.bindatgriež jaunu funkciju, kurasthisvērtība ir "sasaistīta" ar nodoto pirmo argumentu uz mūžu.
const anotherObj = { name: 'Another Obj' }; function displayContext() { console.log(this.name); } displayContext.call(anotherObj); // Another Obj displayContext.apply(anotherObj); // Another Obj const boundFunction = displayContext.bind(anotherObj); boundFunction(); // Another Obj -
Līnijas funkcijas: Līnijas funkcijas nav savas
this. Tās "noķer"thisvērtību no leksiskās vides, kurā tās tika deklarētas. Tas tās padara noderīgas atpakaļsaucēs metodes iekšienē vai darbā ar DOM notikumiem.const objWithArrow = { name: 'Arrow Obj', method() { const arrowFunc = () => { console.log(this.name); // `this` ņemts no `method` (objWithArrow) }; arrowFunc(); } }; objWithArrow.method(); // Arrow Obj // Salīdzinājumam ar parastu funkciju const objWithRegular = { name: 'Regular Obj', method() { const regularFunc = function() { console.log(this); // `this` būs window vai undefined (atkarībā no stingrā režīma) izsaukuma brīdī }; regularFunc(); } }; objWithRegular.method(); // window (vai undefined)
Konteksta definīcija ir viena no galvenajām JavaScript iezīmēm, un šo noteikumu izpratne ir būtiska, lai pareizi strādātu ar funkcijām un objektiem.