2013-06-02 13 views
16

Mam obiekt, który jest przekazywany w wielu różnych funkcjach wewnątrz funkcji. te funkcje mogą, ale nie muszą, zmieniać wartość obiektu, ale jeśli go zmieniają, to chciałbym uzyskać najnowsze zmiany obiektu.Obiekt przekazu javascript jako odniesienie

Oto co im próbuje zrobić:

var ob = {text: 'this is me', name: 'john'} 

function (object) { 

    changeObject(object); 
    customObjectChanger(object); 
    callback = function (object) { 
      object.text = 'new text'; 
    } 

    callback(object); 

    // object value here should be object{text: 'new text', name: 'john'};  
} 
+2

JavaScript automatycznie przesyła obiekty przez odniesienie przez cały czas. Czy próbowałeś powyższego kodu, aby sprawdzić, czy już robi to, co chcesz? – jcsanyi

+0

nie, nie mam. Czytałem to. chciałem tylko tutaj potwierdzić. – Basit

+2

JavaScript nie * nie * [Prześlij przez odniesienie] (http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference). Jednak JavaScript * nie tworzy kopii obiektów, gdy są one przekazywane lub przypisywane *. Jako taki jest to * ten sam * obiekt o innej nazwie - zmiany wprowadzone do obiektu (z dowolnej nazwy) wpływają na wspomniany obiekt. – user2246674

Odpowiedz

79

W obiekty JavaScript są zawsze przekazywane przez kopiowaniem odniesienia. Nie jestem pewien, czy jest to poprawna terminologia, ale kopia referencji do obiektu zostanie przekazana.

Oznacza to, że wszelkie zmiany dokonane w obiekcie będą widoczne po zakończeniu wykonywania funkcji. .

Kod:

var obj = { 
 
    a: "hello" 
 
}; 
 

 
function modify(o) { 
 
    o.a += " world"; 
 
} 
 

 
modify(obj); 
 
console.log(obj.a); //prints "hello world"


Mimo, że skoro to tylko kopia odniesienia, która jest przekazywana w razie was ponownie przypisać obiekt wewnątrz twojej funkcji, będzie to , a nie widoczne poza funkcją, ponieważ było to tylko kopia zmieniona referencja.

Kod:

var obj = { 
 
    a: "hello" 
 
}; 
 

 
function modify(o) { 
 
    o = { 
 
    a: "hello world" 
 
    }; 
 
} 
 

 
modify(obj); 
 
console.log(obj.a); //prints just "hello"

+0

http: // en.wikipedia.org/wiki/Evaluation_strategy - Wolę "Dzielenie się przez [Object] udostępnianie" ze względu na jego bezpośredniość, oddzielenie problemów związanych z implementacją i mniejszą niejednoznaczność z innymi konwencjami wywoływania. ECMAScript nie * używa * "odniesienia" w tym celu w dowolnej części specyfikacji. (Typ specyfikacji referencyjnej nie ma zastosowania do wywołań funkcji.) – user2246674

+2

+1 dla jasnego opisu, co różni się od tradycyjnego przejazdu referencyjnego. – jcsanyi

+0

@user - interesujące - dziękuję za informację. Któregoś dnia przejdę do czytania specyfikacji :) –

3

"Przedmioty" nie są wartościami w JavaScript, a nie może być "przeszedł".

Wszystkie wartości, z którymi masz do czynienia, to odniesienia (wskaźniki do obiektów).

Przekazywanie lub przypisywanie odniesienia daje inne odniesienie wskazujące ten sam obiekt. Oczywiście możesz modyfikować ten sam obiekt poprzez inne odniesienia.

+1

Rzeczywiście - więc kopia odniesienia do obiektu jest ... "przeszła" -_- –

+0

Rzeczywiście obiekt nie zostanie przekazany, ale odniesienie będzie, i można zmodyfikować jego właściwości, jeśli zmienisz je wewnątrz odbiornika funkcjonować – Ignacio