partial
用来固定函数的部分参数
1 | function partial(fn) { |
rest parameter
es6 为我们提供了剩余参数(rest parameter)语法,允许我们将一个不定数量的参数表示为一个数组。
1 | function fn(a, b, ...rest) { |
通过这一特性我们可以简化 partial实现的代码:
1 | function partial(fn, ...args){ |
写个demo测试一下
1 | function add(a, b) { |
restArgs
如果不使用 … 拓展运算符,仅使用es5的内容,该怎么实现呢?
1 | // 第一版 |
优化
我们默认使用传入的函数的最后一个参数存储剩余的参数,为了更加灵活,我们可以再增加一个参数,用来指定startIndex,如果没有指定,就默认使用最后一个参数.
此外,我们使用Array(length)创建数组,而length的计算方式是arguments.length - startIndex,这个值可能是负数!比如:
1 | var func = restArgs(function(a, b, c, d) { |
所以我们再写一版
1 | function restArgs(func, startIndex) { |
性能优化
如果是正常写业务,可能到这里就结束了,然而 underscore考虑的更多,鉴于call的性能要高于apply,所以underscore做了一个优化
1 | var restArgs = function(func, startIndex) { |
至此,restArgs函数就完成了,underscore很多函数比如 invoke、without、union、difference、bind、partial、bindAll、delay都用到了restArgs函数
在underscore中,我们通过 _.underscore的形式调用该函数
restArgs 与 partial
最后,我们用restArgs函数重写一下 partial函数:
1 | var partial = restArgs(function(fn, args) { |