Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.04.2018, 13:26
Профессор
Отправить личное сообщение для Faab Посмотреть профиль Найти все сообщения от Faab
 
Регистрация: 16.04.2012
Сообщений: 310

Где у меня идёт утечка памяти?
Здравствуйте. Вот такой пример:

function Example(){
    this.name;
    this.container_name_selector = "";
}

Example.prototype.init = function(name, container_name_selector, selector_button){
    var self = this;

    self.name = name;
    self.container_name_selector = container_name_selector;

    $("."+selector_button).on("click", {self: self}, self.eventClickButton);
}

Example.prototype.eventClickButton = function(e){
    var self = e.data.self;

    $("."+self.container_name_selector).text(self.name);
    return false;
}


Примечание: зачем я передаю self в событие click: если я не пепередам экземпляр класса, то я не знаю как потом в функции eventClickButton() обратится к свойствам класса Example.

При каждом событии click растёт память в браузере. Где я ошибаюсь?

Последний раз редактировалось Faab, 28.04.2018 в 13:47.
Ответить с цитированием
  #2 (permalink)  
Старый 28.04.2018, 13:47
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,733

Не знаю где память течет, но разве так не будет работать?
function Example() {
    this.name;
    this.container_name_selector = "";
}

Example.prototype.init = function(name, container_name_selector, selector_button) {
    this.name = name;
    this.container_name_selector = container_name_selector;

    $("." + selector_button).on("click", this.eventClickButton.bind(this));
}

Example.prototype.eventClickButton = function(e) {
    e.preventDefault();

    $("." + this.container_name_selector).text(this.name);
}
Ответить с цитированием
  #3 (permalink)  
Старый 28.04.2018, 14:03
Профессор
Отправить личное сообщение для Faab Посмотреть профиль Найти все сообщения от Faab
 
Регистрация: 16.04.2012
Сообщений: 310

Я не знал про этот метод. Сперва я прочитал bind() в контексте jquery и долго не мог понять смысл вашего кода. Но потом прочитал bind() в контексте метода и теперь понятно что вы делаете.

Спасибо, попробую ваш метод. Посмотрю, повлияет ли это на пямять.
Ответить с цитированием
  #4 (permalink)  
Старый 28.04.2018, 14:05
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

Сообщение от Faab
При каждом событии click растёт память в браузере. Где я ошибаюсь?
А как вы смотрите утечку памяти? В браузерах сборщик мусора срабатывает редко (в хроме можно вызвать вручную на вкладке Memory в Developer tools). Память растёт прям до бесконечности или останавливается на каком-то уровне?
Ответить с цитированием
  #5 (permalink)  
Старый 28.04.2018, 14:47
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Faab,
В jquery .bind() это старый .on(), а js .bind() это jQuery.proxy().
Ответить с цитированием
  #6 (permalink)  
Старый 28.04.2018, 15:17
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Крутил коды по варианту ТС и Nexus, и вот такой ужатый (в т.ч. без self с bind(this))
Память растет на первых двух кликах. Сбор мусора в хроме ничего не дает.
Почему двух??

(в примере здесь замеры немножко нерегулярно прыгают)
<div class='div_class'></div>
<button class = 'but_class'>Click</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<script>

function Example(){
    this.name;
    this.container_name_selector = "";
    self = this;
    this.eventClickButton = function(e, attribute){
       $("."+self.container_name_selector).text(self.name);
    };
    this.init = function(name, container_name_selector, selector_button){
        this.name = name;
        this.container_name_selector = container_name_selector;
        $("."+selector_button).on("click",  this.eventClickButton);
    };
};

var Test = new Example();
Test.init('Test','div_class','but_class');
</script>

Последний раз редактировалось Dilettante_Pro, 28.04.2018 в 15:25.
Ответить с цитированием
  #7 (permalink)  
Старый 29.04.2018, 13:00
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Если хотите хорошую производительность - забудьте про jQuery.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery навигация, утечка памяти Foxeh AJAX и COMET 8 19.04.2015 16:53
Копирование строк (касательно памяти) Hapson Общие вопросы Javascript 5 19.01.2014 13:18
Утечка памяти в плагине для jQuery. TheWanderer jQuery 0 20.11.2013 16:22
Утечка памяти и борьба новым способом) KupueIIIKo Элементы интерфейса 6 03.08.2012 11:55
утечка памяти и window.open Vovan222 Events/DOM/Window 2 27.12.2010 19:19