underscore的restArgs - pod4g/tool GitHub Wiki

使用

// a,b,c不是必须的。可用arguments访问
var fn1 = function(a,b,c){
  console.log(a);
  console.log(b);
  console.log(c);
}

var fn2 = restArgs(fn1,1);

/*
  打印:
  1
  [2, 3, 4, 5]
  undefined
*/
fn2(1,2,3,4,5);  

fn2 = restArgs(fn1,2);

/*
 打印:
 1
 2
 [3,4,5]
*/
fn2();

restArgs源码

 /**
   * [restArgs 把指定索引处之后的参数处理成一个数组]
   * @param  {[Function]} func       [要处理的函数]
   * @param  {[Number]} startIndex   [开始索引]
   * @return {[Function]}            [返回接收参数的函数]
   */
  var restArgs = window.restArgs = function(func, startIndex) {

    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    
    return function() {
      // 实参的个数 - startIndex
      var length = Math.max(arguments.length - startIndex, 0);
      // 创建一个length长度的稀疏数组
      var rest = Array(length);
      // 给稀疏数组填值
      for (var index = 0; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  };