2015-03-16 4 views
0

Рассмотрим этот кусок кода, который является основным примером передачи аргумента по значению (здесь это объект, который передается по значению):Передача объектов по значению в функции

function setName(obj) { 
obj.name = "Pork"; 
obj = new Object(); 
obj.name = "Chicken"; 
} 

var person = new Object(); 
setName(person); 
alert(person.name); 

Выход этот код - «Свинина» (очевидно), но я пытаюсь понять, почему новый объект, созданный в функции setName, не перезаписывает значение, хранящееся в obj. Вместо этого это, по-видимому, создает указатель на локальный объект, который уничтожается при завершении функции.

+0

Вы хотите прочитать [ответ] (http://stackoverflow.com/a/3638034/1960455) на вопрос [Является ли JavaScript перекрестной ссылкой или языком с пересылкой?] (Https : //stackoverflow.com/questions/518000). –

+1

Возможный дубликат [Является ли JavaScript паролем или ссылкой по языку?] (Http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass -by-value-language) –

+0

Спасибо, я прочитаю все ответы и посмотрю, разъяснят ли они то, что я просил. – dolanator

ответ

4

объекты передаются как ссылки в JavaScript, но сама ссылка имеет значение. Другими словами, вы можете изменять только элементы входного объекта, но не ссылки. Что происходит в линии

obj = new Object(); 

является то, что локальная копия ссылки на «OBJ» изменен, но это локальная копия отбрасывается, когда функция возвращает.

+0

Я думаю, это помогло бы, если бы эти книги, которые преподавали JS, более четко заявили, что примитивы передаются по значению (как копия), а объекты передаются по значению в качестве ссылки (в основном, указатель в терминах C++). – dolanator

3

obj, хотя это имя аргумента, ведет себя как локальная переменная в пределах функции setName. Когда функция вызывается, она ссылается на все, что было передано в качестве аргумента. Когда вы устанавливаете его равным новому, другому объекту, он ведет себя как локальная ссылка, а теперь указывает на (новый) объект. В этот момент вы потеряли ссылку на исходный аргумент. (А когда функция заканчивается, ссылка на более новый объект сам потерял.)

function setName(obj) { // "obj" is the local variable that will refer to the argument 
obj.name = "Pork"; // obj points to the object passed in, which is modified 
obj = new Object(); // obj is set to point to a new Object 
obj.name = "Chicken"; // the new object is modified. 
    // the new object is dropped here 
} 
+0

Отличное объяснение. Но почему моя скрипка http://jsfiddle.net/L07877p7/ дает ошибку? – Manwal

+1

@Manwal - Потому что вы (и OP) используете неправильный стиль цитат. – j08691

+0

@Manwal: символы цитаты были неправильными - это были типографские кавычки. Я зафиксировал их как прямые кавычки, и теперь он работает на скрипке. –

0

Каждый раз, когда вы используете это: new Object(), вы создаете новый экземпляр объекта. Если вы хотите изменить текущую информацию, вам нужно будет придерживаться той же переменной, не создавая переменную new Object().

0

Ваш анализ правилен. Обратите внимание, что в вашей существующей функции вы передавали ссылку на объект, созданный до его вызова. Затем вы заменили ссылку ссылкой на новый объект.

Если вам нужно было построить новое значение, вам нужно либо сделать это возвращаемым значением функции, либо установить новый объект как атрибут аргумента или как значение в массиве.

0

когда вы звоните setName функцию, вы передаете ссылку на person к it.now как obj и person имеет ссылку на объект. obj не имеет person объекта (ни делает person) .both person и obj акции object.when создать новый объект new Object(), присвоить ссылку на этот объект в obj .so Теперь obj не имеет ссылки на совершенно разные object.thats почему вы не можете мутировать person объект больше.

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