2014-04-25 2 views
4

Я относительно новичок в Javascript и работаю над большим проектом, написанным в настоящее время исключительно на js. Одним из понятий, которые я прочитал, являетсяКак проходит javascript по ссылке?

Проходя в объекте, передает его по ссылке.

Следующий код, похоже, не соответствует правилу, которое js передает ссылку в случае объектов.

var a = {b:2}; 
var modify = function(a) {a = {d:4}}; 
modify(a); 
print a; //a is still {b:2}. 

Почему значение a в приведенном выше примере не изменилось?

Примечание: в документе указано, что объекты передаются по ссылке в Javascript.

+0

Единственные возможные значения объектов, доступные в JavaScript, - это ссылки во всех случаях *. – Pointy

+4

Терминология сбивает с толку. Термин * pass-by-reference * имеет определенное значение в отношении параметров функции. – Pointy

+0

Это сообщение в блоге snook.ca является легендарно неправильным. – Pointy

ответ

7

Передача в объекте, передает его в качестве ссылки.

№. JavaScript всегда pass-by-value. Если вы передадите объект, то значение будет ссылкой на объект. Если это было пропущено ссылкой, вы получите ссылку на переменную , которая передается в функцию.

Вы можете мутировать сам объект путем добавления, удаления или изменения свойств, но изменение значения параметране магическим образом изменить значение переменной передается.

Пример:

var a = {b:2}; 
var modify = function(a) { 
    delete a.b; 
    a.d = 4; 
}; 
modify(a); 
print a; 

TL; др: Вы не можете никогда изменить значение переменной a, назначая различные значения переменной b.

+0

В ссылке wiki, которую вы указали. В нем говорится, что «все, что передается в вызов функции, не изменяется в области вызова, когда функция возвращается». но на самом деле вы можете мутировать передаваемый объект. Не так ли. Поведение с объектом, передаваемым как параметр, отличается от примитивных значений. Почему бы вам назвать этот пропуск по значению. – raju

+2

* «Поведение с объектом, передаваемым как параметр, отличается от примитивных значений». * Нет, это не так, по крайней мере, вы не можете сказать, что это (или нет). Разница в том, что все примитивные значения на самом деле * неизменяемы *. Что касается *, все, что передается в вызов функции, не изменяется в области вызова, когда функция возвращается. "*, Я вижу, что вы имеете в виду. Если вы посмотрите дальше на страницу, есть еще один раздел о «совместном вызове», который, как представляется, вызывает это поведение. Однако, по-моему, это по-прежнему «позывной» (насколько я понимаю). –

+0

Невозможно наблюдать какую-либо разницу между передачей примитива и передачей объекта. Даже на уровне реализации они передаются точно так же, так что это был бы настоящий подвиг. – Esailija

7

Ничто в JavaScript не передается по ссылке, то легко убедиться в этом, пытаясь реализовать обмен:

var a = 3; 
var b = 5; 
swap(a, b); 
// Implement swap so that a is now 5 and b is now 3 
// It is impossible. 
+0

да это так. var a = {}; (функция (v) {v.b = 2}) (a); console.log (а); – DoXicK

+0

@DoXicK: Вы сами мутируете объект, вы не изменяете значение 'a'. –

+0

@DoXicK это не какой * пересылка по ссылке * означает. – Pointy

0

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

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