这种情况没法给你们提供Demo啊,这要游戏玩好久才能测出来的问题哦!!!
class Timer
_indexHandler(handler) {
var caller = handler.caller;
var method = handler.method;
var cid = caller ? caller.$_GID || (caller.$_GID = ILaya.Utils.getGID()) : 0;
var mid = method.$_TID || (method.$_TID = (Timer._mid++) * 100000);
handler.key = cid + mid;
this._map[handler.key] = handler;
}
就这几行代码,试想下每次一个新的执行域caller进来那对应的$_GID是不是就自增,但是method.$_TID这个就不一定会变了,那随着caller.$_GID的不断自增,本来(注意_map这玩意是个数组)_map[cid+mid]里一个不应该被替换的handler那不就被替换掉啦!!
像class CallLater这个类里面也有一个_indexHandler一模一样的方法,那边采用的是(_map是kv)_map[cid + '.' + mid]字符串拼接当做key来存储,这种方式就不可能出现被覆盖的情况