Scope - YunusEmreCMD/blokTech GitHub Wiki
Scope is een belangrijk concept dat de beschikbaarheid van variabele beheert, de scope definieert het idee van globale en lokale variabelen. Als developer die Javascript gaat of wilt coderen is het belangrijk om te begrijpen wat scope precies inhoudt. Scope is als het ware het bereik. Zichtbaarheid of beter gezegd de toegankelijkheid van een variabele. Zoals ik net al aangaf bestaat een scope uit 2 soorten bereik.
- Lokaal (Local scope)
- Globaal (Global scope)
Lokale Javascript variabelen
Variabelen die binnen een Javascript functie zijn gedeclareerd, worden lokaal voor de functie. Dit houdt in dat je deze variabele alleen in deze specifieke functie kan gebruiken en niet erbuiten.
Omdat lokale variabelen alleen binnen de functie worden herkend, kunnen variabelen met dezelfde naam in andere functies gebruikt worden.
Klein voorbeeldje
if (true) {
const message = 'Hello';
}
console.log(message); // ReferenceError: message is not defined
Deze stuk code zal een error geven, dit komt doordat de variabele message
niet herkent wordt, deze is namelijk niet gedeclareerd.
Wel binnen de functie, maar dit is buiten bereik van de console.log. De volgende blok code werkt wel, omdat ze samen in de functie zitten.
if (true) {
// "if" block scope
const message = 'Hello';
console.log(message); // 'Hello'
}
Globale scope
De globale scope is de meest toegankelijke scope van allemaal, en is dus vanuit elke plaats in je code beschikbaar. Variabele die in deze globale scope worden gedeclareerd worden globale variabele genoemd. Deze variabele kunnen dan ook vanuit elke functie worden geopend of gewijzigd. Ook alle scripts en functies op een webpagina hebben er toegang toe. Een voorbeeld:
Var userName = "Bill";
function modifyUserName() {
userName = "Steve";
};
function showUserName() {
alert(userName);
};
alert(userName); // display Bill
modifyUserName();
showUserName();// display Steve
in het bovenstaande voorbeeld wordt de variabele userName
een globale variabele omdat deze buiten de functie gedeclareerd wordt. De functie adjustUserName ()
wijzigt gebruikersnaam aangezien gebruikersnaam een globale variabele is en toegankelijk is binnen elke functie. Op dezelfde manier geeft de functie showUserName ()
de huidige waarde van de variabele gebruikersnaam weer.
Wanneer variabele binnen een functie zonder het trefwoord var er achter worden gedeclareerd worden deze ook automatisch een globale variable als de functie waarin deze variabele staat minstens 1x wordt aangeroepen.
Andere soorten scopes
Blokken code met de statements als if,for en while creëren een eigen scope zie voorbeelden:
for (const color of ['green', 'red', 'blue']) {
// "for" block scope
const message = 'Hi';
console.log(color); // 'green', 'red', 'blue'
console.log(message); // 'Hi', 'Hi', 'Hi'
}
while (/* condition */) {
// "while" block scope
const message = 'Hi';
console.log(message); // 'Hi'
}
Ook kun je in Javascript standalone code blocks maken, deze hebben ook een eigen scope.
{
// block scope
const message = 'Hello';
console.log(message); // 'Hello'
}
Nested scope
Scopes kunnen ook genest worden, in de volgende voorbeeld zie je dat de if code block (scope) genest wordt in de functie van run, dit wordt ook wel inner scope genoemd. De scope die om een andere scope heen zit wordt de outer scope genoemd, in dit geval is dat de functie genaamd run.
function run() {
// "run" function scope
const message = 'Run, Forrest, Run!';
if (true) {
// "if" code block scope
const friend = 'Bubba';
console.log(message); // 'Run, Forrest, Run!'
}
console.log(friend); // throws ReferenceError
}
run();
Bronnen
JavaScript Scope. (z.d.). Geraadpleegd op 9 maart 2021, van https://www.w3schools.com/js/js_scope.asp
Scope in JavaScript. (z.d.). Geraadpleegd op 9 maart 2021, van https://www.tutorialsteacher.com/javascript/scope-in-javascript
Pavlutin, D. (2020, 24 april). A Simple Explanation of Scope in JavaScript. Geraadpleegd op 9 maart 2021, van https://dmitripavlutin.com/javascript-scope/#:%7E:text=The%20scope%20is%20an%20important,of%20variables%20is%20a%20must.