2015-03-02 11 views
8

considerare questa funzione JavaScript:Argomenti e di riferimento

var f = function (a) { 
    console.log(a+" "+arguments[0]); 
    a = 3; 
    console.log(a+" "+arguments[0]); 
} 

Mi aspetterei che a e arguments[0] riferimento lo stesso valore solo fino alla seconda affermazione della funzione. Invece essi sembrano riferirsi sempre lo stesso valore: f(2) provoca

2 2 
3 3 

e f({foo: 'bar'}) cause:

[object Object] [object Object] 
3 3 

sono identificatori di argomento e l'identificatore arguments legato in modo speciale?

+1

Sì, ed è una brutta cosa e penso che cambierà comunque. –

+0

Questo è un duplicato, penso, sono sicuro che a questo si fa riferimento da qualche parte..Io cercherò di scavare fuori – Liam

+0

possibile duplicato di [È JavaScript un linguaggio pass-per-referenziale o pass-by-value?] (Http : //stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) – Liam

risposta

7

Gli identificativi degli argomenti e l'identificatore degli argomenti sono collegati in modo speciale?

Sì (ma solo in modalità non rigida).

Dalla descrizione (ES6, ES5):

Per non severe funzioni del modo le proprietà dei dati interi indicizzato di un oggetto arguments cui nome valori numerici sono inferiori al numero di parametri formali della funzione corrispondente l'oggetto inizialmente condivide i loro valori con i collegamenti degli argomenti corrispondenti nella funzione execution context. Ciò significa che la modifica della proprietà modifica il valore corrispondente del binding dell'argomento e viceversa. Questa corrispondenza è interrotta se tale proprietà viene cancellata e quindi ridefinita o se la proprietà viene modificata in una proprietà accessor. Per le funzioni in modalità rigorosa, i valori delle proprietà dell'oggetto arguments sono semplicemente una copia degli argomenti passati alla funzione e non esiste alcun collegamento dinamico tra i valori delle proprietà e i valori dei parametri formali.

Problemi correlati