2014-05-12 26 views
6

Come ho capito gli oggetti vengono passati per riferimento in JavaScript (e le primitive vengono passate per valore?).Comprendere il passaggio per riferimento e valore con le funzioni

var a, b; 
a = { 
    Foo: "Bar" 
} 
b = a; 
a.Foo = "Other"; 
console.log(b.Foo); // "Other" 

questo ha funzionato in modo simile con gli array, ma non ha funzionato come mi aspetto con funzioni:

var a, b; 
a = function(){ return 20; } 
b = a; 
a = function(){ return 40; } 
console.log(b()); // returns 20 ? 

Sono confuso perché ho pensato funzioni sono oggetti. L'esempio sopra non dovrebbe restituire 40?

risposta

11

Nel primo caso, a.Foo = ..., Si sta modificando il valore di una proprietà nell'oggetto, riferito da entrambi a e b. Questo è chiamato mutazione di un oggetto.

Ma nel secondo caso, si sta facendo riferimento a a un nuovo oggetto funzione. Ora, a e b si riferiscono a diversi oggetti funzione.

Ecco perché nel secondo caso ricevi 20.

1

Si sta riassegnando la variabile a a una nuova funzione. Non è come cambiare un valore di una proprietà.

Prova:

var a, b; 
a = {Foo: function() {return 20;}}; 
b = a; 
a.Foo = function() {return 40;}; 
console.log(b()); // returns 40 
2

A seguito @thefoutheye's answer, si consideri la seguente prova della sua dichiarazione funzioni sono oggetti:

var a, b; 
a = function() { return 20; } 
a.Foo = "Bar"; 
b = a; 
a.Foo = "Other"; 
console.log(b.Foo); // "Other" 
2

prima per quanto riguarda la domanda nel titolo (che in realtà è diverso da cosa dimostrate con gli esempi di codice):

"Come ho capito gli oggetti sono passati per riferimento in JavaScript"

No, Javascript non supporta il passaggio del parametro per riferimento. Tutti i parametri vengono passati per valore, ma il valore può essere un riferimento.

Esempio:

var a = { answer: 42 }; 

function f(x) { 
    alert(x.answer); // shows 42 
    x = { answer: 0 }; 
    alert(x.answer); // shows 0 
} 

f(a); 
alert(a.answer); // shows 42 

Poiché il parametro viene passato per valore, la variabile x è separato dalla variabile a, così assegnando un nuovo oggetto x non modifica il valore di a.

Torna al tuo codice:

Quando si assegna un riferimento a un oggetto da una variabile ad un altro, è il riferimento che viene copiato, non l'oggetto. Ottieni due variabili che fanno riferimento allo stesso oggetto.

Entrambe le variabili possono essere utilizzate per accedere ai membri nell'oggetto, come dimostra il primo esempio di codice.

Se si assegna un nuovo oggetto alla prima variabile, si sostituirà il riferimento nella variabile, non si sovrascriverà l'oggetto a cui punta attualmente.L'oggetto è ancora intatto e la seconda variabile punta ancora ad esso. Ottieni due variabili che puntano a un oggetto ciascuna, come dimostra il tuo secondo esempio di codice.

Problemi correlati