//(http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html) // This accumulates the arguments passed into an array, after a given index. // 和ES6中的rest特性相似,根据给定参数的索引位置,将参数填充到索引之后的位置上 //(参见 https://github.com/jashkenas/underscore/issues/2542) var restArgs = function(func, startIndex) { startIndex = startIndex == null ? func.length - 1 : +startIndex; returnfunction() { var length = Math.max(arguments.length - startIndex, 0), rest = Array(length), index = 0; for (; index < length; index++) { rest[index] = arguments[index + startIndex]; } switch (startIndex) { case0: return func.call(this, rest); case1: return func.call(this, arguments[0], rest); case2: 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); }; };
createAssigner函数主要是用在下面三个地方:
1 2 3 4 5 6 7 8 9
// Extend a given object with all the properties in passed-in object(s). _.extend = createAssigner(_.allKeys);
// Assigns a given object with all the own properties in the passed-in object(s). // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) _.extendOwn = _.assign = createAssigner(_.keys); // Fill in a given object with default properties. _.defaults = createAssigner(_.allKeys, true);