Почему эта переменная еще жива? - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть следующий исходный код.

testObj = {}

function testFun()
{
    this.name = "hi";   
}

function test () {

    var instanceOfTestFun = new testFun();

    testObj.pointerToFun = instanceOfTestFun;

    instanceOfTestFun = null;

    console.log(testObj);

}

$(document).ready(test);

Я ожидал увидеть 'null' для вывода на консоль testObj , но я вижу функцию testFun . Я думал, что javascript использует 'pass by ref' для объектов.

Пожалуйста ... посоветуйте мне ...

Ответы [ 3 ]

7 голосов
/ 01 декабря 2011

testObj.pointerToFun и instanceOfTestFun - две ссылки на один и тот же объект.

Когда вы пишете instanceOfTestFun = null, вы меняете instanceOfTestFun, чтобы указывать на ничто.
Это не влияетtestObj.pointerToFun, который все еще ссылается на исходный объект.

Если вы измените исходный объект (например, instanceOfTestFun.name = "bye"), вы увидите изменение через оба средства доступа, так как они оба указывают на (теперьизменен) объект.

1 голос
/ 01 декабря 2011

Сам объект не уничтожается, если для свойства, содержащего ссылку на него (instanceOfTestFun), установлено значение null. Вы можете только косвенно уничтожить объект, удалив последнюю ссылку на него (то есть на тот момент это значение, сохраненное testObj.pointerToFun), поэтому он будет собираться мусором.

Ни при каких обстоятельствах нельзя удалять свойство testObj без ссылки на него.

Не путайте свойства (instanceOfTestFun, testObj, testObj.pointerToFun) со значениями, которые они могут содержать (ссылки на свойства, как после testObj.pointerToFun = instanceOfTestFun, или обычные значения, как 9 или null ).

1 голос
/ 01 декабря 2011
var x = {};

Приведенная выше строка создает объект и сохраняет ссылку на него внутри переменной x.

var y = x;

В строке выше копируется ссылка из переменной x в переменную y,Теперь и x, и y содержат ссылки на объект.

x = null;

В строке выше удаляется ссылка, которая была сохранена внутри x.Объект, на который ссылается эта ссылка, не является сборщиком мусора, поскольку переменная y по-прежнему содержит ссылку на него.

Любой данный объект живет до тех пор, пока на него ссылается хотя бы одна ссылка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...