看pomelo sample 源码
exp.playerLeave = function(args, cb) {
var areaId = args.areaId;
var playerId = args.playerId;
var player = area.getPlayer(playerId);
if (!player) {
utils.invokeCallback(cb);
return;
}
area.removePlayer(playerId);
area.getChannel().pushMessage({route: 'onUserLeave', code: consts.MESSAGE.RES, playerId: playerId});
utils.invokeCallback(cb); //问题1
};
utils
// callback util
utils.invokeCallback = function(cb) {
if (!!cb && typeof cb == 'function') {
cb.apply(null, Array.prototype.slice.call(arguments, 1));//问题2
}
};
问题1 :直接cb(null , obj)
不好吗?
问题2:Array.prototype.slice.call(arguments, 1)
不就是 arguments.slice(1);
吗?
你的问题代码中已经回答了。
问题1,站在全局看,playerLeave 方法还在其他地方调用,有可能没有cb,invokeCallback 也可以变相理解为兼容,省去你写if(cb) cb(null)
- 加了一层验证
- arguments不是数组对象,是类数组对象。没有slice方法
arguments不是数组(arrya),是类数组(like-array),所以它没有原生数组拥有的slice方法,所以你需要借用原生数组的方法来slice
@dayuoba cb虽然只有一个参数,对应的是arguments[0] , 调用函数的时候可以多于一个参数,只能通过arguments使用, arguments有length属性 可是arguments为何不实现为Array呢?
涨姿势啦,谢谢
请不要介意我叫你一声“js菜鸟”,这是很基础的知识
@qianjiahao 想问一下Array.prototype.slice.call(arguments, 1)
为什么不写成Array.slice.call(arguments, 1)
呢?
@20082496 因为slice是Array的原型对象上的方法,不是Array的方法,换句话说是要通过Array的实例来调用的
@20082496 可以[].slice.call(arguments, 1)