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