2013-04-17 2 views
1

Я уверен, что здесь отсутствует что-то очевидное, но я ожидаю, что аргумент метода changeMe будет передан «по ссылке» - другими словами, что изменение параметра внутри функции изменит переменную за пределами функция.Почему мой аргумент javascript не передан «по ссылке»?

В jsfiddle было запущено следующее: с помощью инструментов разработчика Chrome F12 для отображения вывода консоли. http://jsfiddle.net/fzEpa/

var object1 = { Property1: 'Value1' }; 
changeMe(object1); 
console.log(object1); 

function changeMe(refToObject) { 
    console.log(refToObject); 
    refToObject = { Property1: 'Value2' }; 
    console.log(refToObject); 
} 
+1

См. [Является ли JavaScript паролем или языком с пересылкой?] (http://stackoverflow.com/q/518000/897024) – Kapep

+1

В ссылке @kapep, Я был смущен «переданным элементом передается по значению. Но элемент, который передается по значению, сам по себе является ссылкой». - пока я не увидел, что это применимо к моему собственному коду. Теперь это имеет смысл –

ответ

11

Это передается по ссылке, но это ссылка на объект, а не к переменной object1 (который также является ссылкой на объект).

Вы переписываете ссылку на объект со ссылкой на новый объект.

Это оставляет исходную ссылку на оригинальный объект неповрежденным.

Чтобы изменить объект, вы могли бы сделать что-то вроде этого:

function changeMe(refToObject) { 
    refToObject.Property1 = 'Value2'; 
} 
+0

Похоже, что мои FF Ночные сетки сломаны. +1 для первого ответа. –

+0

«Вы переписываете ссылку на объект со ссылкой на новый объект». делает это довольно ясным. Спасибо –

3

Ссылка на объект передается в качестве значения аргумента. Однако:

refToObject = { Property1: 'Value2' }; 

На данный момент вы теряете ссылку на объект, на который ссылается ранее refToObject, как вы присваиваете эту переменную для ссылки на другой объект.

Теперь, если бы вы отредактировали свойства refToObject вместо того, чтобы отбрасывать прежнюю ссылку на объект, ваш код будет работать как exepected (как в первую очередь объясняется в ответе @ Quentin).

+0

почти галстук с @Quentin. Ясное объяснение - хотя чтение вокруг, кажется, что-то обидно в заявлении «Он передан по ссылке». Из того, что я теперь понимаю, это, кажется, ссылка, которая передается по значению (если действительно передана по ссылке, я думаю, мой код должен был сработать) –

+0

@GregWoods Wording - это не моя самая сильная точка, но вы правы, на других языках, таких как PHP, которые отлично работают, когда действительно передаются в качестве ссылки ([demo] (http: // codepad. viper-7.com/El977T)), лучшей формулировкой будет: «ссылка на объект передается как значение аргумента», исправлено это. '=]' –

0

Если вы знакомы с C++ это будет равно делать что-то вроде этого:

void f(int* ref) { 
    ref = new int(3); 
} 
int* a = new int(5); 
f(a); 
printf("%d",a); //Prints 5 
0

вы пытаетесь переопределить свойство 1, поэтому он не работал бы. для того, чтобы работать с pass by reference ypu, нужно сделать это таким образом refToObject.Property1='Value2' внутри вашего ChangeMe() функция. см. это для лучшего понимания. Pass Variables by Reference in Javascript

Смежные вопросы