微信小程序跨页面通信解决思路

var app = getApp()Page({ onUnload: function(){ // remove all app.event.off() // remove all callbacks app.event.off('afterPaySuccess') // remove specific callbacks app.event.off('afterPaySuccess', this.afterPaySuccess) }, ...})

到此就结束了吗?还没有,按照我们的订阅、注销写法,在注销指定回调函数的时候,其实是永远注销不了的。

完善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 改写: