La cosa importante da capire qui è che tutti i nomi in JavaScript sono riferimenti ad altri oggetti.
Quando si crea un oggetto con letterale Oggetto, i nomi di sinistra vengono utilizzati per riferirsi agli oggetti già indicati dai nomi dei lati di destra.
In questo caso, quando si fa
blog: loca,
stai dicendo blog
per riferirsi al valore di cui da loca
, che è 5. In seguito quando si incrementa loca
, diventa 6
, vuol dire che si riferisce a qualche altro valore, ma blog
si riferisce ancora al valore 5
.
Ecco perché ci si trova 5
.
Ma quando lo fai
namepace.frog()
si stanno ottenendo il valore corrente di cui da loca
. Poiché viene assegnato 6
in getLocal
, stai ricevendo 6
.
Incremento crea nuovo oggetto numero
Per rendere ancora più chiaro, quando si fa
loca += 1;
o
loca++;
ciò che accade internamente a dire, qualcosa di simile
oldValue = loca
newValue = oldValue + 1
loca = newValue
di riferimento da ECMAScript 5.1 Specifiche, per +=
e per ++
Dato che i numeri sono oggetti immutabili (si può cambiare il valore di 5
? Non è possibile, è per questo che viene chiamato un oggetto immutabile), viene creato un nuovo oggetto numero con uno aggiunto e il nome loca
viene creato per fare riferimento al nuovo oggetto.
oggetti mutabili
Se ci pensate oggetti mutabili,
var namepace = (function() {
var loca = [];
return {
glob: function() {
loca.push(1);
return loca;
},
blog: loca,
frog: function() {
return loca;
}
};
})();
console.log(namepace.glob());
// [ 1 ]
console.log(namepace.blog);
// [ 1 ]
console.log(namepace.frog());
// [ 1 ]
Ora, sia blog
e loca
si riferiscono allo stesso oggetto array. Quello che succede in glob
si chiama mutazione.Stai semplicemente aggiungendo un elemento all'array oggetto con due nomi blog
e loca
. Ecco perché namepace.blog
stampa anche [ 1 ]
.