Middle
Hoe voorkom je het wijzigen van de context in JavaScript?
sobes.tech AI
Antwoord van AI
In JavaScript wordt de uitvoeringscontext van een functie (de waarde van this) dynamisch bepaald op het moment van aanroep. Het volledig verhinderen van deze verandering is niet mogelijk in absolute zin, maar je kunt de context op verschillende manieren controleren of vastleggen:
-
Methoden
call,apply,bind:callenapplystellen je in staat om een functie uit te voeren met een expliciete context en argumenten (callmet gescheiden argumenten,applymet een array).bindcreëert een nieuwe gebonden functie, waarbijthisvastgezet wordt op de opgegeven waarde bij het aanmaken, ongeacht de daaropvolgende aanroep. Dit is de meest effectieve manier om "het wijzigen van de context" te "verbieden".
// Voorbeeld met bind const obj = { value: 42 }; function showValue() { console.log(this.value); } const boundShowValue = showValue.bind(obj); boundShowValue(); // Toont 42 boundShowValue.call({ value: 100 }); // Toont nog steeds 42, de context is vastgezet -
Pijlfuncties (Arrow Functions):
- Arrow functies hebben geen eigen
this. Ze vangenthisuit de omringende (lexicale) scope tijdens hun definitie. - De context van een arrow functie kan niet gewijzigd worden met
call,apply, ofbind.
// Voorbeeld met arrow functie const outerObj = { name: 'Outer' }; class MyClass { constructor() { this.className = 'MyClass'; this.showNameArrow = () => { // `this` hier vangt `this` uit de constructor of de scope van definitie console.log(this.className); }; } showNameRegular() { // `this` wordt hier bepaald bij het aanroepen console.log(this.className); } } const instance = new MyClass(); instance.showNameArrow(); // Toont 'MyClass' const anotherObj = { className: 'Another' }; const boundArrow = instance.showNameArrow.bind(anotherObj); // Poging tot contextwijziging boundArrow(); // Toont nog steeds 'MyClass', de context van de arrow functie is onveranderlijk instance.showNameRegular.call(anotherObj); // Toont 'Another', de context van de normale functie verandert - Arrow functies hebben geen eigen
Kort samengevat, "het verbieden van contextwijziging" wordt het beste begrepen als het stevig vastzetten van de context. Hiervoor worden bind voor normale functies en de natuurlijke lexicale binding voor arrow functies gebruikt. Arrow functies zijn in dit opzicht meer "onverzettelijk".