Andrise programmeerimisalane WIKI

Nimeruumid

Nimeruum on üldjaotatud nimekogum, milles kõik nimed on ühesed, pakkudes konteksti erinevate muutujate ja funktsioonide üheseks defineerimiseks. Näiteks kui programmis on defineeritud mingi funktsioon, mis võib minna konflikti teise samas programmis oleva funktsiooniga (funktsioonid on deklareeritud sama nimega), võib probleemi ennetamiseks lülitada selle funktsiooni hoopis mõnda sobivasse nimeruumi.

Nimede ühesuse probleem tekib peamiselt, kui kasutatakse ühes programmis korraga erinevaid teeke - võib juhtuda, et erinevates teekides on deklareeritud sama nimega funktsioonid, mis tegelikult on täiesti erineva funktsionaalsusega. Taolise probleemi lahendamiseks nimeruume kasutataksegi.

JavaScriptis saab nimeruume luua läbi objektide - selle asemel, et deklareerida funktsioon globaalses skoobis, defineerime selle mõne kindla objekti meetodina. Nii saab objektist nimeruumi kandja ning loodud meetodist nimeruumis asuv funktsioon.

if(!window.NIMERUUM){
    NIMERUUM = {}
}
 
NIMERUUM.alert = function(tekst){
    document.write(tekst);
}
 
alert(123);
NIMERUUM.alert(123);

Näites kontrollime esiteks, kas globaalses objektis (brauseris on selleks window) on nimeruumi objekt NIMERUUM juba olemas ning kui ei ole, siis loome selle. Seejärel lisame nimeruumi uue funktsiooni alert, mis väljastab sisendi brauseri aknasse käsuga document.write. Niiviisi saame deklareerida funktsiooni nimega alert, ilma et see läheks konflikti globaalse skoobi funktsiooniga alert.

Sellisel objektide abil loodud JavaScripti nimeruumid on hirerahilised, kuna nimeruumis asuvad objektid võivad ka ise nimeruumi kandjaks olla.

NIMERUUM.VIDINAD = {};
NIMERUUM.vidinad.alert = function(tekst){
    console.info(tekst);
}
 
NIMERUUM.VIDINAD.alert('test');

Nimeruumide korral ei saa funktsioone deklareerida kujul function NIMERUUM.funktsioon(){..}, vaid ainult läbi lambda avaldiste, kus anonüümne funktsioon omistatakse muutja väärtuseks NIMERUUM.funktsioon = function(){..}.

Objekti kujul nimeruume saab kasutada ka dünaamiliselt.

var nimeruum;
if(a>b){
    nimeruum = window;
}else{
    nimeruum = NIMERUUM;
}
 
nimeruum.alert(123);

või isegi nimeruumi nime stringina töödeldes

var nimeruum = window['NIME' + 'RUUM'];
nimeruum.alert(123);