2012-06-08 4 views
9

Верно ли, что в функциях JavaScript возвращаются объекты, отличные от Boolean и Numbers, по ссылке?Возвращаясь по ссылке в JavaScript?

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

+0

Javascript не C. – doug65536

ответ

17

Объекты не уничтожены до все ссылки на них исчезли и собраны мусор. Когда объект возвращается, вызывающий код получает ссылку на него, а объект не собирает мусор.

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

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

+0

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

8

Верно ли, что в функциях JavaScript возвращаются объекты, отличные от булевых, и числа по ссылке?

Это правда, объекты в JavaScript являются всегда передается по ссылке

Как это возможно, когда эти объекты уничтожены, когда функция те принадлежат заканчивается?

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

6

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

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 

где неопределенные означает, что он был скопирован, а не передаются по ссылке. Обратите внимание, что строки также не передаются по ссылке.

2

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

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'} 

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

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