今天犯了一個常見的錯誤:

window.addEventListener('homescreenopened', function onhomeopen() {
  window.removeEventListener('homescreenopened', onhomescreen);
  this.publish('closedbykilling');
}.bind(this));

大意:註冊一次 homescreenopened 事件,等他發生後發出 closedbykilling 事件給管理者移除自己。

結果發現每次 homescreenopened 發生時這邊都會再執行一次,造成 memory leak...

原因

function 被 bind 之後就會變成另一個新的 function,原來 function name 已經不能代表這個新的 function 了。
所以第二行的 removeEventListener 會失效。

解決方法

  1. 用 closure 把 this 變成 self
    var self = this;
    window.addEventListener('homescreenopened', function onhomeopen() {
    window.removeEventListener('homescreenopened', onhomescreen);
    self.publish('closedbykilling');
    });
    
  2. 給新的 function 名字再拿去作 addEventListener。
    var onhomeopen = function () {
    window.removeEventListener('homescreenopened', onhomescreen);
    this.publish('closedbykilling');
    }.bind(this);
    window.addEventListener('homescreenopened', onhomeopen);
    

Comments

comments powered by Disqus