underscore 源码中 _.invoke 的疑问
_.invoke = restArgs(function(obj, method, args) {
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
var func = isFunc ? method : value[method];
return func == null ? func : func.apply(value, args);
});
});
上面
return func == null ? func : func.apply(value, args);
/* 这里判断了 func == null 返回 func,那对 method 是否是函数的判断有什么意义?
* 比如 _.invoke([{a:1},{a:2}], 'a') 期望的结果应该是 [1,2],
* 而现在明显会执行 func.apply(value, args),然后就出错了
* 所以我觉得这里应该判断的是 func 是否是函数,不是的话,直接返回 func
*/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
功能上这样似乎不错,但'a'不是function,不是function就不可invoke,这是处于语意一致性考虑。
另外你可能注意到了,value[method]的边界既可以是null也可以是undefined,因为undefined == null -> true此时return func的目的还是为了一致性,在underscorejs.org官网的浏览器console里试试:
invoke的目的是调用method,边界是null或者undefined,除此这两种情况就越界了,报错是应该的。
这代码其实很有品味。