javascript удалит мою переменную несмотря на глобальную ссылку - PullRequest
0 голосов
/ 23 августа 2010
window.global_array = new Array();  
window.example = function()  
{  
     var x = new Object();  
     x['test_property'] = 3;  
     global_array.push(x);  
}

Гуру Javascript, пожалуйста, ответьте на три вопроса:

  1. удалит javascript x в конце области при возврате example () или сохранит его в global_array.
  2. Могу ли я с уверенностью предположить, что javascript работает как "все ссылки" в python?
  3. все ли виртуальные машины созданы одинаковыми или правила GC будут различаться в зависимости от реализации.

1 Ответ

4 голосов
/ 23 августа 2010
  1. Да. x будет удалено, поскольку область его действия ограничена телом функции (вы использовали ключевое слово var, что гарантирует это. Переменные, объявленные без var, будут глобальными, даже если они находятся в теле функции). Однако значение x будет по-прежнему присутствовать в global_array.
  2. Не совсем. Объекты (массивы тоже!) Передаются как ссылки, примитивные значения (например, числа) будут скопированы.
  3. GC зависит от реализации, но это не должно вас беспокоить. Реализации JavaScript будут вести себя одинаково, если только не будет ошибки.

Поскольку x ссылается на объект, присваивание (до push()) увеличивает счетчик ссылок. Когда x выходит из области видимости в конце функции, это не уменьшит счетчик ссылок до 0, поэтому объект все еще будет там - его единственная ссылка теперь находится в пределах global_array.

...