该项目的 GitHub 地址为 underscore-analysis,所有文章都在这里,并将不断更新。如果你觉得我的解读还可以,对你学习 js 有一定的帮助,欢迎 Watch && Star,你的关注和肯定必定会促使我投入更多的时间和经历做好这个系列。如果你愿意的话,也欢迎 Fork,我们一起来将这个系列做好做大,一起成长。
有两个重要的内部函数对 underscore 实现迭代方法十分重要,underscore 定义的所有有关迭代的方法基本都用到了这两个内部函数。我们通过 _.each() 和 _.map() 两个迭代方法来学习一下这两个内部函数。
1. 用 optimizeCb 优化迭代函数(回调函数)
|
上面的代码定义了 each 方法,函数体内首先是对回调函数进行优化,这里用到了
underscore 的一个内部函数 optimizeCb,我们来看一下这个内部函数是怎么工作的
|
其中 switch 那部分并没有指定回调中参数的个数,而只是判断参数的个数,确保优化的时候不会弄乱参数的个数。
说白了,optimizeCb 函数唯一的作用就是在不扰乱回调参数个数的情况下为回调指定上下文。
2. 用 cb 判断类型并优化
|
上面的代码定义了 map 方法,这个方法的第二个参数可能是函数,对象,字符创等,所以,函数体内一开始要对第二个参数类型进行判断,再选择如何对其进行优化:
总的来说,cb 函数的返回值是一个函数,根据 value 值的类型的不同,返回的函数的功能也不同,对于 cb 函数来说,主要完成下面的功能:
- 如果 value 为空,那么返回一个能返回自身值的函数(这里返回的是_.identity)
- 如果 value 为函数,那么调用 optimizeCb 函数,为 value 绑定上下文并将其返回
- 如果 value 为对象,返回一个是否匹配属性的函数
- 如果 value 为字符串,那么返回一个可以获取 对象 属性值的函数
3. 涉及的依赖
3.1 _.identity
|
3.2 _.property
这个函数返回一个函数,返回的函数可以得到传入其中的集合(obj)的相应属性值(key)
3.3 isArrayLike
这个函数可以判断传入的集合是不是一个数组或类数组,是的话返回 true,不是返回 false
3.4 isFunction
|
3.5 isObject
|
3.6 matcher
matcher 函数将在之后的文章中介绍,因为它依赖了其他几个 underscore 中定义的关于对象的方法。