Функции в js копируются/передаются по значению или ссылке

Я знаю, что объекты в Javascript копируются/передаются по ссылке. Но как насчет функций?

Я пробовал этот код, когда перешел к чему-то запутанному. Вот фрагмент кода:

x = function() { console.log('hey 1'); }

y = x;

x = function() { console.log('hey 2'); }

y; // Prints function() { console.log('hey 1'); }

Если такие функции, как объекты, копируются/передаются по ссылке, почему y не обновляется для печати «привет 2»?

Если такое поведение связано с тем, что «x» назначается совершенно новой функцией, есть ли способ для переменной «y» использовать новую назначенную функцию при изменении x?


person Adarsh Konchady    schedule 19.11.2015    source источник
comment
Это поведение идентично поведению, которое вы бы увидели, если бы сделали { x: 1 } и { x: 2 } вместо function() { console.log('hey 1'); } и function() { console.log('hey 2'); }. ваша текущая формулировка звучит так, будто вы наблюдаете разные шаблоны для объектов и функций, что не может быть правдой.   -  person apsillers    schedule 19.11.2015
comment
Константа, которую я нашел почти во всех языках программирования, заключается в том, что оператор = изменяет только переменную, на которую он ссылается (например, фактическую ссылку x), а не базовые данные. Если у типа есть метод .modify() или .add(), это один из способов изменения базовых данных, чтобы они были видны через несколько переменных.   -  person Katana314    schedule 19.11.2015
comment
Извините - самооговор: в JavaScript = используется для изменения свойств объекта, которые, безусловно, могут быть видны по другим ссылкам. например: var b = a; a.myprop = 3; console.log(b.myprop);   -  person Katana314    schedule 19.11.2015
comment
Если такие функции, как объекты, копируются/передаются по ссылке, почему y не обновляется для печати «привет 2»? Вы делаете ложные предположения. В JavaScript все передается по значению.   -  person Felix Kling    schedule 19.11.2015


Ответы (3)


Все в JS передается по значению, где значение для объектов и функций является ссылкой.

Здесь происходит то же самое, что и с объектом (поскольку функции — это просто первоклассные объекты):

Вот суть происходящего:

x = function() { console.log('hey 1'); }

x указывает на function() that logs 1 (для этой функции создается память)

y = x;

y указывает на function() that logs 1 (та же ячейка памяти)

x = function() { console.log('hey 2'); }

x теперь указывает на новый function() that logs 2 (новое пространство памяти), однако на y ничего не повлияло

y;

y по-прежнему указывает на тот же function() that logs 1


Если вы хотите, чтобы изменения x повлияли на y, вам следует изменить то, что на что они указывают, а не то, на что они указывают.

Например:

var pointingAtMe = { log: function() { console.log('1'); } }
var x = pointingAtMe;
var y = pointingAtMe;

// change the actual thing x and y are both pointing to
x.log = function() { console.log('2'); } // this line also sets `y.log` and `pointingAtMe.log`since they all point to the same thing
// and the change gets applied to both
y.log(); // logs '2'
person nem035    schedule 19.11.2015

Если такие функции, как объекты, копируются/передаются по ссылке, почему y не обновляется для печати «привет 2»?

Вы делаете ложные предположения. В JavaScript все передается по значению. Правильно, что объекты представлены в виде ссылок, но это отличается от передача по ссылке.

Даже если вы использовали обычный объект вместо функции, вы не увидите того, что ожидали:

var x = {foo: 42};
var y = x;
x = {foo: 21};
console.log(y.foo); // still 42

Передача по значению/ссылке описывает только то, как разрешаются переменные и параметры, и не имеет ничего общего со значением переменные.

Если такое поведение связано с тем, что «x» назначается совершенно новой функцией, есть ли способ для переменной «y» использовать новую назначенную функцию при изменении x?

Нет. Не без явного назначения y.

person Felix Kling    schedule 19.11.2015

x = function() { console.log('hey 2'); } не изменяет объект, содержащийся в переменной x, но изменяет содержимое переменной x.

person RiccardoC    schedule 19.11.2015