[JS] Efficient gebruik globale variabelen

Pagina: 1
Acties:

  • Oysterhoys
  • Registratie: Juni 2003
  • Laatst online: 15-12-2024
Aan globale variabelen kleven nadelen, zoals bekend. Ik weet alleen geen goede manier om zonder een globale variabele te gebruiken, in een functie te zien of de functie al een of meerdere keren aangeroepen is, aangezien JS dus geen 'statische' variable kent, waarmee je dit lokaal eenvoudig zou kunnen oplossen.

Weet iemand hier voor een oplossing? En zo niet, zou het in een array stoppen van meerdere globale variabelen dan tenminste een verbetering zijn, qua performance van een geheel script.

A friend is one who knows us, but loves us anyway.


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 01:05

orf

Zoiets kan toch (beperkte js kennis hier)


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>

function teller(){
    if (!this.id){
        this.id = 0;
    }
    alert(this.id);
    this.id++;
}


</script>
<button onclick="teller()">

  • Oysterhoys
  • Registratie: Juni 2003
  • Laatst online: 15-12-2024
Blijkbaar niet zo beperkt, het lijkt me de oplossing. :)
Ik kende die toepassing van 'this' niet.

Nog steed benieuwd of groep globale variabelen,
zoals de 'settings' van een programma efficienter zijn in een array.

A friend is one who knows us, but loves us anyway.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20-02 15:44
JavaScript=======Objecten

Maak dus geen settings in een array o.i.d. maar doe iets als:
code:
1
2
3
4
object fiets
  method setFietsType
  methode setFietsKwaliteit
  //etcetera


Waarom? Je kan dan meerdere objecten op 1 pagina gebruiken, je hebt alles bij elkaar, nette code etcetera. Ik heb op een paar bugfixjes voor stomme browsers nooit globale variablen nodig. Het enige wat bij mij globaal aangemaakt wordt is de instantie van de objecten. Deze roep je echt nooit meer aan na de initiatlisatie!

  • Oysterhoys
  • Registratie: Juni 2003
  • Laatst online: 15-12-2024
Tja dat lijkt me wijs.
Ik zie het nog niet zo 123.
Ik begrijp de principes van oop wel,
maar zie van deze oplossing de code nog niet voor me.

Ik stel me voor dat elke setting dan bijv. een andere instantie is van de settings-class
Maar afijn ik kom er wel uit.
Ik moet mijn object georiënteerdheid sowieso opkrikken.

A friend is one who knows us, but loves us anyway.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20-02 15:44
Geef eens een concreet voorbeeld van wat je aan het maken bent. Dan zal ik je een opzetje geven zodat je een idee hebt.

  • Oysterhoys
  • Registratie: Juni 2003
  • Laatst online: 15-12-2024
Ik wil mijn code overzichtelijk houden en mijn interface eventueel multi-language maken.
Alle window.alert teksten, heb ik apart in een script met messages.

dus messagesNl.js
mesWelkom = "Welkom op de site bla bla bla heel verhaal dat ik niet in de functie wil"

dus messagesUk.js
mesWelkom = "Welcome on the sites site bla bla bla "

ergens anders heb ik bijvoorbeeld een functie die van alles doet, maar o.a. window.alert(mesWelkom)
eventueel met een language check, of ik laad dynamisch een andere messageCountryX.js

Nu heb ik al die messages als aparte globale variabelen.

A friend is one who knows us, but loves us anyway.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20-02 15:44
Beetje overkill voor je situatie maar maakt het wel duidelijk.

Maak een soort interface naar die messages toe:
code:
1
2
3
4
5
6
7
8
9
10
object Messages
  method addMessage (messageID, messageObject)
  method getMessage (messageID //eventueel: languageID)
  //eventueel
  method setDefaultLanguage

object Message
  method setContent (content, languageID)
  method setType //zo kan je bijvoorbeeld alerts, confirms e.d. allemaal inbouwen
  methode getMessage (languageID)


Dan kan je dit implementeren als:
code:
1
2
3
4
5
6
7
8
9
10
//de enige globale var:
var messagesList=new Messages;
messagesList.setDefaultLanguage('EN');

//per message:
myMessage=new Message();
myMessage.setContent('hello', 'EN');
myMessage.setContent('hallo', 'NL');
myMessage.setType('alert'); //dit zou je weer verder uit kunnen werken maar lijkt me ultieme overkill
messagesList.addMessage(1, myMessage);


Als je dan een message wilt sturen aan de gebruiker doe je iets als:
code:
1
messagesList.getMessage(1);


Waarom is dit nou handig: Je kan nu bijvoorbeeld bepalen dat je zodra een taal niet beschikbaar is hier een error voor geven, of je kan bijvoorbeeld altijd dan de Engelse weergeven etcetera. Ook kan je nu bijvoorbeeld besluiten om in plaats van die standaard alerts een namaak alert te tonen bij browser die dit ondersteunen enzovoorts. Alles komt er op neer dat je nu heel flexibel kunt werken. Je kunt dit soort dingen nog veel verder uitwerken waardoor je schitterende mogelijkheden krijgt maar dat vereist nog wel wat oefening ;)

Mooi topique: [rml][ purisme] prototypes / OO in JavaScript *[/rml]

  • Oysterhoys
  • Registratie: Juni 2003
  • Laatst online: 15-12-2024
Ziet er mooi uit en is leerzaam voorbeeld.
Voor dit geval lijkt het me inderdaad overkill,
dan denk ik dat een messages array handiger is

messages(1) = "hallo beste mensen";
messages(2)= "zou u mijn site willen verlaten, hacker";
( twijfel hier nog over syntax (1) of [1] )

of mooier,
messagges['welkom'] = "hallo beste mensen";
messagges['oprotten'] = "zou u mijn site willen verlaten, hacker";
hoewel mischien lastig met aanhalingstekens alert(messagges['oprotten'])

Dank voor de uitleg _/-\o_

A friend is one who knows us, but loves us anyway.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20-02 15:44
Maak dan op z'n minst een functie waarmee je de tekst ophaalt. Bijvoorbeeld iets simpels als:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
var messages=new Array();
messages['welkom'] = "hallo beste mensen";
messages['oprotten'] = "zou u mijn site willen verlaten, hacker";

function showMessage(messageKey) {
  alert(messages[messageKey]);
}

function voorbeeld() {
  showMessage('welkom');
}
window.onload=voorbeeld;


Je kan dan bijvoorbeeld checken of het woord uberhaupt wel beschikbaar is.
Pagina: 1