到此就结束了吗?还没有,按照我们的订阅、注销写法,在注销指定回调函数的时候,其实是永远注销不了的。
完善off方法
为了让每个回调函数被调用时的 this 都指向对应的 Page 对象,必须在订阅时对回调函数绑定当前的上下文对象。
app.event.on('afterPaySuccess',this.afterPaySuccess.bind(this))
相当于
app.event.on('afterPaySuccess', function(){ var args = Array.prototype.slice.call(arguments) // fn、that分别为闭包起来的回调函数和page对象 return fn.apply(that, args)})
正因为 bind 方法会返回这样一个匿名函数,然后这个匿名函数会被加入到回调数组中。因此我们注销指定回调函数的时候,在回调数组中是找不到它的,也就永远无法注销。
为了保持我们原来的 emit 调用方式,我想过直接把 Function.prototype.bind 改写: