lodash源码分析之invoke
本文为读 lodash 源码的第一百四十九篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
依赖
import castPath from './.internal/castPath.js'
import last from './last.js'
import parent from './.internal/parent.js'
import toKey from './.internal/toKey.js'
《lodash源码分析之castPath》 《lodash源码分析之last》 《lodash源码分析之parent》 《lodash源码分析之toKey》
源码分析
invoke 会调用 object 指定 path 上的方法,可以指定一组参数 args ,在调用方法时传入。
源码如下:
function invoke(object, path, args) {
path = castPath(path, object)
object = parent(object, path)
const func = object == null ? object : object[toKey(last(path))]
return func == null ? undefined : func.apply(object, args)
}
先用 castPath 将 path 转换成属性路径数组,然后使用 parent 函数取出 path 取出路径终点的父级的值。
因为已经取出终点父级的值,因此只需要用 last 取出终点的 key ,再从父级中取出对应 key 的值,即为需要调用的函数 func 。
取出 func 之后,如果 func 有值,则通过 apply 将 args 传入,并且函数的 this 绑定为 object ,这样和直接使用 . 来调用函数的结果一致。
这也是为什么要这样绕,不直接用 baseGet 或者 get 函数来取值的原因,因为要拿到路径 path终点父级的值 object,调用 apply 的时候可以绑定。
License
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面