Het eerste slagveld
“Zien;
het meest veelzijdige vaardigheid van bewust zijn.”
- Sam Rain
- Sam Rain
Tijd voor een paar lesjes met het Elvenzwaard
van Aragon – de variabelen. De ijverige elf zal inmiddels het één en ander
doorhebben, maar voor de hobbits die voor het eerst buiten de Shire treden is
het onderwerp vast nog redelijk abstract. Variabelen zijn referenties naar
plaatsjes in het geheugen – en geheugen is heel belangrijk voor snelle
elvenmagie.
De tovenaarsfilosofie dat meer geheugengebruik
de boel langzamer maakt, is voor de hand liggend. Tovenaars die draken moeten
verslaan hebben het liefst korte spreuken, dan dat ze een heel spreukenboek
moeten voorlezen. Iedere keer dat er een variabele wordt ‘gebruikt’ neemt dat
al tijd in beslag en ‘nieuwe’ variabelen nemen geheugen in beslag.
Er zijn twee soorten opslaggegevens voor
JavaScript: een referentie en een daadwerkelijk stuk geheugen. Om met
variabelen te kunnen rekenen is JavaScript een brave Kobold – nummers, booleans
en datum primitieven ‘schrijft’ JavaScript over; alsof het een kopie betreft.
Tovenaars noemen dit letterlijk overnemen ‘copy by value’. Arrays, Strings en
Functies worden door JavaScript aangestipt met een voetnoot, die verwijst naar
een ander hoofdstuk. Tovenaars, zoals altijd, hebben ook hier een term voor,
namelijk ‘copy by reference’.
Hoe vaker een toverspreuk een letterlijke
kopie maakt, hoe meer geheugen er wordt gebruikt. Nu doet JavaScript het meeste
‘werk’ zelf, maar ijverige elven zullen toch wat bewuster moeten zijn. Neem de
volgende functie eens als voorbeeld:
function optellen (a,b,c,d,e,f,g,h,i)
{ var oplossing = a+b+c+d+e+f+g+h+i;
a -
return oplossing;
}
{ var oplossing = a+b+c+d+e+f+g+h+i;
a -
return oplossing;
}
Als alle variabelen nummers zouden zijn, worden
er een hoop variabelen gemaakt. Praktischer is het om een lijst te maken en
deze door te geven:
var nummers AtotI = new Array
(1,5,3,12,5,30,7,77,4); /*een genummerde lijst*/
function optellen(lijst) { var som;
for (var i=o; i <l ijst.length; i++) /*’i’ is onze ‘tellende’ variabele*/
{ som + = lijst[i]; /*de + = operator telt de waarde rechts op bij de waarde die al aanwezig is in de linker */
}
return som;
}
var totaal = optellen (nummers AtotI);
function optellen(lijst) { var som;
for (var i=o; i <l ijst.length; i++) /*’i’ is onze ‘tellende’ variabele*/
{ som + = lijst[i]; /*de + = operator telt de waarde rechts op bij de waarde die al aanwezig is in de linker */
}
return som;
}
var totaal = optellen (nummers AtotI);
Hoewel deze functie meteen overweldigend is,
werkt deze efficiënter dankzij referenties. Als we 10000 woorden willen
optellen, zou de functie beschrijving een leven in beslag nemen met het 1e
voorbeeld al – laat staan het aantal variabelen die per optelsom aangemaakt
zouden moeten worden.
JavaScript doet het moeilijke en zware werk
voor alle wezens van Midden-Aarde; wanneer een variabele zijn levensduur heeft
‘opgebruikt’, dan worden deze verwijderd. Om dit te kunnen doen, hoeft de
ijverige elf alleen maar goed gebruik te maken van het ‘zicht’ – door de Tovenaars
en Orcs de ‘scope’ genoemd. Alle variabelen tussen de accolades en haakjes
‘leven’ tot het laatste haakje. Daarnaast kunnen variabelen tussen de accolades
niet naar variabelen kijken in andere accolades. Kijk eens naar de volgende
toverspreuk:
var meesterRing = “Sauron”; /*deze variabele
is een ‘global’, dat wil zeggen dat deze ‘leeft’ tot het eind van de
toverspreuk.*/
function draagRing(ring)
{ /*de ‘ring’ variabele is binnen deze accolades te gebruiken omdat deze een ‘parameter’ is van de functie*/
if (ring==”Sauron”) /*met de == operator kun je variabelen vergelijken*/
{
var gewonnen = true; /*de variabele ‘gewonnen’ is aangemaakt, meer leeft niet verder dan deze accolades!*/
}
meesterRing=”Frodo”;
/*hoewel meesterRing binnen deze accolades staat, wordt deze toch in het hele script aangepast, omdat deze al bestond vóór de andere accolades*/
}
var eigenaar = draagRing (meesterRing);
/*eigenaar is “Frodo”*/
function draagRing(ring)
{ /*de ‘ring’ variabele is binnen deze accolades te gebruiken omdat deze een ‘parameter’ is van de functie*/
if (ring==”Sauron”) /*met de == operator kun je variabelen vergelijken*/
{
var gewonnen = true; /*de variabele ‘gewonnen’ is aangemaakt, meer leeft niet verder dan deze accolades!*/
}
meesterRing=”Frodo”;
/*hoewel meesterRing binnen deze accolades staat, wordt deze toch in het hele script aangepast, omdat deze al bestond vóór de andere accolades*/
}
var eigenaar = draagRing (meesterRing);
/*eigenaar is “Frodo”*/
Meer
lezen over Programmeren? Klik hier
voor de inhoudsopgave van alle artikelen!
©SamRain
JavaScript - 18
JavaScript - 18
Geen opmerkingen:
Een reactie posten