Современные двигатели не будут поддерживать неиспользованные переменные во внешней области.
Поэтому не имеет значения, если вы установили data = null
перед возвратом внутренней функции, поскольку внутренняя функция не зависит от («закрыть») data
.
Если внутренняя функция сделал зависит от data
--perhaps возвращает его - то установка data = null
конечно не то, что вы хотите, потому что тогда, ну, это было бы пустой вместо того, чтобы его первоначальное значение !
Предполагая, что внутренняя функция действительно зависит от data
, то да, до тех пор, как inner
в настоящее время указывает на (ссылается) что-то, то значение data
должны быть вокруг. Но это то, что ты хочешь сказать! Как у вас есть что-то доступное, если оно не доступно?
Помните, что в какой-то момент переменная, которая содержит возвращаемое значение f()
, сама выйдет за рамки. В этот момент, по крайней мере, до f()
вызывается снова, data
будет собираться мусором.
Общее правило: вам не нужно беспокоиться о памяти и утечки с помощью JavaScript. В этом весь смысл GC. Сборщик мусора делает отличную работу по определению того, что необходимо и что не нужно, и сохранению прежнего и мусора, собирающего последний.
Вы можете рассмотреть следующий пример:
function foo() {
var x = 1;
return function() { debugger; return 1; };
}
function bar() {
var x = 1;
return function() { debugger; return x; };
}
foo()();
bar()();
и изучить его исполнение в Chrome Devtools окно переменных. Когда отладчик останавливается во внутренней функции foo
, обратите внимание, что x
нет в качестве локальной переменной или как закрытие. Для всех практических целей его не существует.
Когда отладчик останавливается во внутренней функции bar
, мы видим переменную x
, так как она должна быть сохранена, чтобы быть доступной для возврата.
Сохраняется ли это сегодня? Или эта статья устарела?
Нет, это не так, и да, это так. Статья составляет четыре года, и это целая жизнь в мире Интернета. Я не знаю, может ли jQuery подвергаться утечкам, но я был бы удивлен, если бы это было так, и если да, то есть достаточно простой способ избежать их - не используйте jQuery. Утечки упоминаний автора статьи, связанных с циклами DOM, и обработчики событий отсутствуют в современных браузерах, и я имею в виду IE10 (скорее IE9) и выше. Я бы предложил найти более актуальную ссылку, если вы действительно хотите понять утечку памяти. На самом деле, я предлагаю вам в основном перестать беспокоиться о утечке памяти. Они происходят только в очень специализированных ситуациях. Трудно найти много на эту тему в Интернете в эти дни по этой точной причине. Вот одна статья, которую я нашел: http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html.
Спасибо torazaburo. Меня беспокоит, что последний фрагмент в статье, которую вы предоставили об ошибке Meteor, действительно теряет память в V8. – Jonathan
«На самом деле, я бы посоветовал вам в основном перестать беспокоиться о утечке памяти. Они происходят только в очень специализированных ситуациях». Я категорически не согласен с этим утверждением. По крайней мере, отдельные DOM часто встречаются в SPA-центрах, и каждый разработчик должен знать об этом. –