Middle
Kā atšķiras bultiņas funkcijas no parastajām funkcijām attiecībā uz nepieciešamību izmantot bind metodi?
sobes.tech AI
Atbilde no AI
Šaušanas funkcijas nav sava this konteksta. Tās aizķer this no apkārtējās vides (leksikālā apkārtne).
Parastās funkcijas nosaka savu this atkarībā no tā, kā tās ir izsauktas:
- Globālā kontekstā (
windowvaiglobal). - Kā objekta metode (
thisnorāda uz objektu). - Kā konstruktoru (
thisnorāda uz jaunu eksemplāru). - Izmantojot
call,applyvaibind(thisir skaidri noteikts).
Tā kā šaušanas funkcijas nav sava this, bind izsaukums uz šaušanas funkcijas nav jēdzīgs un nemainīs leksikāli saistīto this. Mēģinot izsaukt bind uz šaušanas funkcijas, tā vienkārši tiks atgriezta pati:
Piemērs:
// Parasta funkcija
const normalFunc = function() {
console.log(this.name);
};
const obj1 = { name: 'Object 1', method: normalFunc };
const obj2 = { name: 'Object 2' };
obj1.method(); // Rezultāts: Object 1
const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Rezultāts: Object 2 (`this` veiksmīgi mainīts)
// Šaušanas funkcija
const arrowFunc = () => {
console.log(this.name);
};
const obj3 = { name: 'Object 3' };
// ArrowFunc ņem `this` no apkārtējās konteksta (šajā gadījumā, globālais objekts)
arrowFunc(); // Rezultāts: undefined (iespējams, jo `this` nesatur `name`)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Rezultāts: undefined (`this` paliek tas pats, bind neietekmēja)
// Piemērs ar `this` noķeršanu
const person = {
name: 'Alice',
greet: function() {
// Šeit `this` norāda uz `person`
const greetLater = () => {
// Šeit `this` tiek noķerts no ārējās `greet` funkcijas, t.i., arī norāda uz `person`
console.log(`Hello, ${this.name}!`);
};
greetLater();
}
};
person.greet(); // Rezultāts: Hello, Alice!
Galu galā, bind metode ir nepieciešama parastām funkcijām, lai skaidri noteiktu to kontekstu this, kamēr šaušanas funkcijām tas ir lieks, jo to this ir leksiski noteikts un nevar tikt mainīts ar bind.