Будет ли этот JavaScript причиной утечки памяти? - PullRequest
4 голосов
/ 02 октября 2011
function outer(){
  var a, b, c;

  function inner1(){
    ...
  }

  function inner2(){
    ...
  }

  inner1();
  inner2();
  ...
}

Я хочу, чтобы глобальное пространство имен было чистым, поэтому я написал код выше.Внутренние функции используются только кодом внутри Outer.Но после этого я начинаю думать, не вызовет ли это каких-либо проблем с памятью.Я не уверен, что внутренние функции создаются заранее или создаются каждый раз, когда external () вызывается?И не вызовут ли они утечку памяти?

Может кто-нибудь помочь объяснить, что произойдет, когда вызывается external () и когда он возвращается?И, пожалуйста, напишите мне, если есть какие-нибудь хорошие книги или статьи об управлении памятью javascript.Меня всегда смущают такие проблемы.Спасибо.

Ответы [ 4 ]

2 голосов
/ 02 октября 2011
1 голос
/ 02 октября 2011

Основная проблема, которая вызывает утечки памяти в браузерах с JavaScript, заключается в том, что DOM и JS имеют два независимых сборщика мусора.Если вы начинаете иметь ссылки на элементы DOM в своей функции замыкания, а затем снова ссылаетесь на что-то внутри функции, вы столкнетесь с проблемами.Ваша структура не протекает, но вы хотите сделать еще кое-что, и это может быть утечка.

0 голосов
/ 02 октября 2011

В ответ на ваш вопрос о создании внутренних функций: я считаю, что ваши внутренние функции создаются / определяются каждый раз, когда вы запускаете outer(), и большинство интерпретаторов JS должны собирать их после запуска outer() вместе свсе остальные переменные в области действия функции - , если outer() не "экспортирует" эти внутренние функции за пределы своей собственной области действия, например, назначая их в качестве обработчиков событий или включая их в оператор возврата для последующего использования.

0 голосов
/ 02 октября 2011

Если вы не поместите в код какой-то другой - вам не следует беспокоиться об утечках в таких простых замыканиях. Современные движки JavaScript справляются с этим очень хорошо.

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