javascript - underscore 源码中 _.invoke 的疑问
ringa_lee
ringa_lee 2017-04-10 15:55:44
[JavaScript讨论组]
_.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 
  */
ringa_lee
ringa_lee

ringa_lee

全部回复(1)
伊谢尔伦
_.invoke([{a:1},{a:2}], 'a') 期望的结果应该是 [1,2]

功能上这样似乎不错,但'a'不是function,不是function就不可invoke,这是处于语意一致性考虑。

另外你可能注意到了,value[method]的边界既可以是null也可以是undefined,因为undefined == null -> true此时return func的目的还是为了一致性,在underscorejs.org官网的浏览器console里试试:

var obj = {fooFunc: null}
_.invoke([obj], 'fooFunc')
[null]

var obj = {fooFunc: undefined}
_.invoke([obj], 'fooFunc')
[undefined]

invoke的目的是调用method,边界是null或者undefined,除此这两种情况就越界了,报错是应该的。

这代码其实很有品味。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号