Middle
Vertel over de context van functies in JavaScript.
sobes.tech AI
Antwoord van AI
De uitvoeringscontext (this) van een functie in JavaScript bepaalt hoe de functie wordt aangeroepen en welke waarden binnen de functie beschikbaar zijn. De context verandert dynamisch afhankelijk van de manier van aanroepen:
- Globale context: Buiten functies verwijst
thisnaar het globale object (windowin de browser,globalin Node.js).// In de browser console.log(this === window); // true // In Node.js console.log(this === global); // true - Context van een functie:
- Standaardaanroep: In niet-strikte modus verwijst
thisbinnen een functie naar het globale object (als de functie geen methode van een object is). In strikte modus ("use strict";) isthisundefined.function showThis() { console.log(this); } showThis(); // In niet-strikte modus: Globaal object; In strikte modus: undefined - Aanroep als methode van een object:
thisverwijst naar het object waartoe de methode behoort.const user = { name: 'Alice', greet: function() { console.log("Hallo, mijn naam is " + this.name); } }; user.greet(); // Hallo, mijn naam is Alice - Met
new(constructor): Maakt een nieuw object dat de waarde vanthiswordt binnen de constructorfunctie, en retourneert dat object.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Expliciete contextaanduiding (
call,apply,bind):call(thisArg, arg1, arg2, ...): Roept de functie aan met de gespecificeerdethisen de argumenten die afzonderlijk worden opgesomd.apply(thisArg, [argsArray]): Roept de functie aan met de gespecificeerdethisen de argumenten in een array.bind(thisArg, arg1, arg2, ...): Geeft een nieuwe functie terug, waarbijthispermanent is gekoppeld aanthisArgen de argumenten vooraf zijn gebonden.
function introduce(greeting, punctuation) { console.log(greeting + ", ik ben " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Hallo", "!"); // Hallo, ik ben Charlie! introduce.apply(person, ["Hallo", "."]); // Hallo, ik ben Charlie. const boundIntroduce = introduce.bind(person, "Hé"); boundIntroduce("?"); // Hé, ik ben Charlie?
- Standaardaanroep: In niet-strikte modus verwijst
- Arrow functies: Hebben geen eigen
this-context. Ze vangenthisuit de omringende lexicale scope waarin ze zijn gedefinieerd.const obj = { name: 'David', sayLater: function() { // `this` hier verwijst naar `obj` setTimeout(() => { // `this` hier verwijst ook naar `obj` (geërfd van `sayLater`) console.log("Later, ik ben " + this.name); }, 1000); } }; obj.sayLater(); // Later, ik ben David