Front end week 3: Context - Hoa0/project-tech GitHub Wiki
Context
Context wordt gebruikt om te verwijzen naar een waarde in een bepaald deel van een code, dit wordt gedaan met het trefwoord this
. Met behulp van de functiemethoden is het mogelijk om de context te kunnen wijzigen (Hammad Agmed, 2017).
In Javascript wordt context over het algemeen op dezelfde manier gebruikt als in natuurlijke taal. Bijvoorbeeld we schrijven: “mijn moeder werd blauw, dit is heel zorgwekkend” i.p.v. “Mijn moeder werd blauw, is erg zorgwekkend”. Als we de context hiervan kennen, kunnen we begrijpen wat ons zo veel zorgen maakt. this
, het verwijst naar objecten, variabelen en we gebruiken het in context (Michal Witkowski, 2017).
Global context
Het gebeurt vaak dat ontwikkelaars het trefwoord this
zonder context gebruiken, waardoor de browser zijn best doet om te begrijpen waar this
in global verwijst.
Hier een voorbeeld, window:
var a = 15;
console.log(this.a);
// => 15
console.log(window.a);
// => 15
Buiten elke functie in een globale executie context verwijst this
naar de globale context (window-object).
Function context
Een functie context kan gezien worden als een zin context, voorbeeld “mijn moeder werd blauw, dit is erg zorgwekkend.” Dit kunnen we ook in verschillende zinnen gaan gebruiken. Voorbeeld: “Er komt een orkaan aan, dit is erg zorgwekkend.” Dit komt op hetzelfde neer, maar dan in een andere context en de betekenis is totaal anders.
Context in JavaScript is gerelateerd aan objecten. Het verwijst naar het object binnen de functie die wordt uitgevoerd. this
verwijst naar het object waarin de functie wordt uitgevoerd (Michal Witkowski, 2017).
// voorbeeld # 1
var a = 20;
function gx () {
return this;
}
function fx () {
return this.a;
}
function fy () {
return window.a;
}
// `this` wordt bepaald door hoe een functie wordt aangeroepen.
// functies worden aangeroepen in een globale context.
console.log(gx() === window);
// => True
console.log(fx());
// => 20
console.log(fy());
// => 20
Wanneer een functie wordt aangeroepen als een methode van een object, wordt this
ingesteld op het object waarop de methode wordt aangeroepen.
// voorbeeld # 2
var o = {
prop: 37,
f: function() {
return this.prop;
}
};
console.log(o.f());
// => 37
// voorbeeld # 3
function fx () {
return this;
}
var obj = {
method: function () {
return this;
}
};
var x_obj = {
y_obj: {
method: function () {
return this;
}
}
};
console.log(fx() === window);
// => True - global context
console.log(obj.method() === window);
// => False - Functie wordt aangeroepen als een methode van een object.
console.log(obj.method() === obj);
// => True - Functie wordt aangeroepen als een methode van een object.
console.log(x_obj.y_obj.method() === x_obj)
// => False - Functie wordt aangeroepen als een methode van het object y_obj, dus dit is de context.
Bij een strict mode zijn regels anders. De context blijft zoals het was gedefinieerd. In het voorbeeld zie je dat het niet gedefinieerd is, het is “undefined.”
// voorbeeld # 4
function f2 () {
'use strict';
return this;
}
console.log(f2() === undefined);
// => True
Net als in het vorige voorbeeld wordt de functie aangeroepen als een methode van een object, ongeacht hoe deze is gedefinieerd.
// voorbeeld # 5
function fx () {
return this;
}
var obj = {
method: fx
};
console.log(obj.method() === window);
// => False
console.log(obj.method() === obj);
// => True
this
is dynamisch, Hierdoor kan het object van het ene naar het anderen veranderen.
// voorbeeld # 6
var obj = {
method: function () {
return this;
}
};
var sec_obj = {
method: obj.method
};
console.log(sec_obj.method() === obj);
// => False
console.log(sec_obj.method() === sec_obj);
// => True
We kunnen this
fruit en objectnaam noemen.
// voorbeeld # 7
var shop = {
fruit: "Apple",
sellMe: function() {
console.log("this ", this.fruit);
// => this Apple
console.log("shop ", shop.fruit);
// => shop Apple
}
}
shop.sellMe()
“new” zorgt voor verandering in de regels, de operator “new” creëert instantie van een object. De context van de functie wordt ingesteld op de gemaakte instantie van een object.
// voorbeeld # 8
var Foo = function () {
this.bar = "baz";
};
var foo = new Foo();
console.log(foo.bar);
// => baz
console.log(window.bar);
// => undefined
Bronnen
Hammad Agmed (2017, 15 februari). Unerstanding Scope in Javascript. Geraadpleegd van, https://scotch.io/tutorials/understanding-scope-in-javascript
Michal Witkowski (2017, 6 oktober). Geraadpleegd van, https://blog.pragmatists.com/the-many-faces-of-this-in-javascript-5f8be40df52e