Верно ли, что в функциях JavaScript возвращаются объекты, отличные от Boolean и Numbers, по ссылке?Возвращаясь по ссылке в JavaScript?
Как это возможно, когда эти объекты уничтожаются, когда функция, к которой они принадлежат, завершается?
Верно ли, что в функциях JavaScript возвращаются объекты, отличные от Boolean и Numbers, по ссылке?Возвращаясь по ссылке в JavaScript?
Как это возможно, когда эти объекты уничтожаются, когда функция, к которой они принадлежат, завершается?
Объекты не уничтожены до все ссылки на них исчезли и собраны мусор. Когда объект возвращается, вызывающий код получает ссылку на него, а объект не собирает мусор.
Технически, стек стека вызываемой функции разрушается, когда он возвращается. Объект, однако, находится не в стеке, а в куче. Локальная ссылка функции на объект находится в стеке и поэтому уничтожается, но ссылка на вызывающий код не уничтожается до некоторого времени позже.
В качестве примечания стороны, это не очень важно, как оно возвращается, потому что функция не может использовать объект в любом случае после его возвращения.
Сама запись активации может сохраняться, когда функция возвращается, если функция повлияла на ее внешнюю область таким образом, чтобы выставить ссылку на нее. То есть, если функция создает экземпляр функции, и эта функция ссылается на локальную область (запись активации или «стековый фрейм» - что это действительно не так), и эта функция возвращается или назначается некоторой относительно глобальной переменной или свойство, то запись активации остается доступной и не собирается. – Pointy
Верно ли, что в функциях JavaScript возвращаются объекты, отличные от булевых, и числа по ссылке?
Это правда, объекты в JavaScript являются всегда передается по ссылке
Как это возможно, когда эти объекты уничтожены, когда функция те принадлежат заканчивается?
Только ссылки уничтожаются, а не сами значения. И пока нет ссылок, объект является кандидатом на сбор мусора.
Две больших ответов, но просто подумал, что я хотел бы добавить, что это достаточно легко проверить:
function modify(arg) {
arg.modified = true;
}
test = 4;
modify(test);
console.log(test.modified); // undefined
test = {};
modify(test);
console.log(test.modified); // true
test = "";
modify(test);
console.log(test.modified); // undefined
где неопределенные означает, что он был скопирован, а не передаются по ссылке. Обратите внимание, что строки также не передаются по ссылке.
Аргументы (включая объекты) отправляются функции по значению. Свойства объекта аргумента доступны и изменяемы, что ведет себя как ссылки. Посмотрите на примере ниже:
function changeObj(obj){obj.a *= 10; return true;}
function killObj(obj){obj = null; return true;}
function changeAndKillObj(obj){obj.a += 1; obj = null; return true;}
var a = {a:1, b:'test'};
console.log(a); //Object {a:1, b:'test'}
changeObj(a);
console.log(a); //Object {a:10, b:'test'}
killObj(a);
console.log(a); //Object {a:10, b:'test'}
changeAndKillObj(a); //Object {a:11, b:'test'}
Практический результат: Вы можете делать все, что вы хотите со свойствами объекта, но не с самим объектом. Любое присваивание аргументу делает его другим объектом и отключается от исходного объекта.
Javascript не C. – doug65536