到此就結束了嗎?還沒有,按照我們的訂閱、注銷寫法,在注銷指定回調函數(shù)的時候,其實是永遠注銷不了的。
完善off方法
為了讓每個回調函數(shù)被調用時的 this 都指向對應的 Page 對象,必須在訂閱時對回調函數(shù)綁定當前的上下文對象。
app.event.on('afterPaySuccess',this.afterPaySuccess.bind(this))
相當于
app.event.on('afterPaySuccess', function(){ var args = Array.prototype.slice.call(arguments) // fn、that分別為閉包起來的回調函數(shù)和page對象 return fn.apply(that, args)})
正因為 bind 方法會返回這樣一個匿名函數(shù),然后這個匿名函數(shù)會被加入到回調數(shù)組中。因此我們注銷指定回調函數(shù)的時候,在回調數(shù)組中是找不到它的,也就永遠無法注銷。
為了保持我們原來的 emit 調用方式,我想過直接把 Function.prototype.bind 改寫: