Переименование ключевого слова this - PullRequest
2 голосов
/ 14 июля 2011

Я обеспокоен тем, что могу использовать шаблон кода, который приводит к утечке памяти.Вот пример псевдокода:

window.user = new User(); 

user.getBasicInfo(function(basicInfo){

  user.name = basicInfo.name;

  user.getDetailedInfo(function(detailedInfo){

    user.favoriteColor = detailedInfo.favoriteColor;

  });

});

Другими словами, я не использую ключевое слово 'this' для ссылки на объект пользователя;Я имею в виду непосредственно объект user, хранящийся в объекте window.

Очевидно, что ключевое слово JavaScript 'this' доставило много проблем людям.Я видел, как некоторые люди переименовывали 'this', чтобы сделать его более понятным, когда они спускаются по цепочке областей действия:

window.user = new User(); 

user.getBasicInfo(function(basicInfo){

  var userInOuterScope = this;    
  userInOuterScope.name = basicInfo.name;
  userInOuterScope.getDetailedInfo(function(detailedInfo){

    var userInInnerScope = this;
    userInInnerScope.favoriteColor = detailedInfo.favoriteColor;

  });

});

Не так красиво, но кажется, что в этом случае цепочка областей действия может быть менее запутанной.

Может ли первый подход утечки памяти?Может второе?Чтобы избежать утечки памяти, я должен передать все в качестве параметра (и никогда не ссылаться на объекты вне текущей области)?

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

Возможность «утечки памяти» не имеет отношения к вопросу, который вы, похоже, задаете. То есть ни один из подходов не влияет на использование памяти, по крайней мере, для меня это никоим образом не ясно.

Причина, по которой вы можете предпочесть использование средства this в своем коде, заключается в том, что вам может понадобиться множество объектов. В вашем случае вы, очевидно, используете объект как синглтон, так что это не имеет значения. Однако это действительно особый случай, и вы быстро обнаружите, что он работает не так хорошо, если у вас есть 100 «пользовательских» объектов.

Сохранение значения this (и на самом деле это не "переименование" this; копирование его значения в другую переменную) внутри замыкания может привести к утечке памяти или, скорее, может быть частью большей утечки памяти, но это само по себе не проблематично. Копирование ссылок на объекты - это то, что происходит постоянно.

изменить & mdash; проблема «утечки» с замыканиями возникает, когда происходит комбинация вещей:

  1. На некоторые объекты ссылаются переменные в области замыкания (не странно и не вредно само по себе);
  2. Функции со ссылками на область замыкания, "убегающие" из вызова функции, либо возвращаемые, либо экспортируемые через глобальные побочные эффекты состояния (такие как регистрация обработчика событий) (также не странные и не вредные сами по себе) ;
  3. Число этих экспортируемых функций увеличивается, или сами функции выделяют больше места при их вызове и сохраняют ссылки на пространство, выделенное в замыкании, или экспортируемые функции заканчиваться прямой ссылкой на узлы DOM (это особенно проблема в IE).

Действительно, у JavaScript нет уникальных проблем с утечками памяти, которые есть у любого языка с реальными замыканиями. Я подозреваю, что для огромного количества реального программного обеспечения JavaScript в этом мире (служебный код, подключенный к веб-страницам), утечка памяти является довольно редкой проблемой, хотя проблема IE с ссылками DOM, вероятно, привела к падению нескольких браузеров за эти годы ( что вряд ли удивило несчастных пользователей).

Мне не нравится навязывать людям фреймворки, но, безусловно, верно, что авторы фреймворков должны беспокоиться об этом. Поэтому хорошей идеей является доверие к вашей среде для поддержания DOM в чистоте, поскольку вы должны только прикреплять обработчики событий и данные к DOM через средства инфраструктуры.

1 голос
/ 14 июля 2011

Похоже, что в вашем коде нет циклических ссылок, поэтому я не стал бы беспокоиться об утечках памяти. Вы не устанавливаете объекты равными другим объектам, насколько я вижу (http://jsfiddle.net/Akkuma/UTL3B/ в качестве быстрого примера того, как это может привести к утечкам памяти).

Вот несколько ссылок на утечки памяти

Кроме того, вы можете использовать инструмент Chrome Snapshot, чтобы определить, есть ли у вас утечки памяти, о которых стоит беспокоиться.

0 голосов
/ 14 июля 2011

JavaScript это не то же самое, что Java или C #.Он представляет текущий контекст чего-либо выполняемого.

...