Javascriptin laajuus sijoitetussa funktiossa


(function(){
    var privateSomething = "Boom!";
    var fn = function(){}
    fn.addFunc = function(obj) {
        alert('Yeah i can do this: '+privateSomething);
        for(var i in obj) fn[i] = obj[i];
    }
    window.fn=fn;
})();

fn.addFunc({
    whereAmI:function()
    {
        alert('Nope I\'ll get an error here: '+privateSomething);
    }
});

fn.whereAmI();

Miksi whereAmI() ei voi käyttää privateSomethingia? Ja miten sijoitan whereAmI():n samaan kontekstiin kuin addFunc()?

Vastaus #1

Javascriptilla on leksikaalinen ulottuvuus: nimi viittaa muuttujiin sen perusteella, missä nimi on määritelty, ei sen perusteella, missä nimeä käytetään. privateSomething etsitään paikallisena whereAmI -funktiossa, ja sitten globaalissa ulottuvuudessa. Sitä ei löytynyt kummastakaan paikasta.

Vastaus #2

JavaScriptilla on leksikaalinen näkyvyysalue, ei dynaamista näkyvyysaluetta (paitsi this). Katso http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_and_dynamic_scoping