Non riesco a capirmi un caso specifico di scoping per le variabili JavaScript. Diverso da altri esempi e domande che ho trovato, mi interessa l'ambito per le funzioni annidate.Ambito locale JavaScript: var rispetto a questo
Ho impostato un esempio su this JSFiddle. La parte rilevante è la seguente:
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + self.a); // self.a = undefined
logMessage("self.b = " + self.b); // self.b = 2
}
}
Ora, capisco che un riferimento alla a
lavora direttamente. Capisco anche che i messaggi 3 e 4 (this.a
e this.b
) non riusciranno perché this
si riferisce alla funzione interna. Capisco anche che la linea 6 funziona perché salvo il riferimento all'oggetto originale.
Quello che non capisco è:
- perché non sono i messaggi 1 e 2 lavorano allo stesso modo?
- perché i messaggi 5 e 6 non funzionano allo stesso modo?
Perché dovrebbero lavorare allo stesso modo? Sembra che tu stia analizzando con Java o qualche altro linguaggio in cui il namespace 'this' è implicito, il che non è il caso di JS. –
@ FabrícioMatté Potrei essere inconscio a fare questo (gioco di parole). Non riesco a capire se l'ambito debba rendere le variabili/membri automaticamente esposti ai membri interni. Sembra che non sia così, perché non è coerente. – Alpha
@Alpha Stai confrontando le variabili ('var a = 5;') con le cose che non sono variabili ma le proprietà degli oggetti ('this.b = 10;' imposta la proprietà 'b' dell'oggetto che' this' fa riferimento a '10'). Queste cose non sono le stesse e quindi non si comportano in modo identico. – Niko