Underscore.js 为什么要使用 "switch' to handle cases instead of "for 循环”
Underscore.js Why using "switch' to handle cases instead of "for loop"
我正在尝试学习 underscorejs 源代码。以上是来自 underscore.js source code VERSION = '1.9.0' 的代码片段。如您所见,开关块和 for 循环:
var restArguments = function(func, startIndex) {
startIndex = startIndex == null ? func.length - 1 : +startIndex;
return function() {
var length = Math.max(arguments.length - startIndex, 0),
rest = Array(length),
index = 0;
for (; 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);
};
};
为什么作者把switch中startIndex [0,1,2]的情况分开处理
是否因为在这些情况下循环必须是 运行 以及 运行 如此小的循环不必要的复杂性?如果这就是作者 select 只有这 3 个案例的原因,为什么不 [0,1,2,3].
他只选择了这 3 个是有原因的还是只是一个选择。
我可以被认为是性能调整。
IMO,[0,1,2] 可能涵盖实际项目中的大多数情况(大多数函数不会有太多参数)。
而且,在典型的 JS 引擎中,call
比 apply
快。看到这个
所以,结合以上两个方面,它可以使代码在大多数情况下运行得尽可能快,并保持源代码足够简单:)
我正在尝试学习 underscorejs 源代码。以上是来自 underscore.js source code VERSION = '1.9.0' 的代码片段。如您所见,开关块和 for 循环:
var restArguments = function(func, startIndex) {
startIndex = startIndex == null ? func.length - 1 : +startIndex;
return function() {
var length = Math.max(arguments.length - startIndex, 0),
rest = Array(length),
index = 0;
for (; 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);
};
};
为什么作者把switch中startIndex [0,1,2]的情况分开处理
是否因为在这些情况下循环必须是 运行 以及 运行 如此小的循环不必要的复杂性?如果这就是作者 select 只有这 3 个案例的原因,为什么不 [0,1,2,3].
他只选择了这 3 个是有原因的还是只是一个选择。
我可以被认为是性能调整。
IMO,[0,1,2] 可能涵盖实际项目中的大多数情况(大多数函数不会有太多参数)。
而且,在典型的 JS 引擎中,call
比 apply
快。看到这个
所以,结合以上两个方面,它可以使代码在大多数情况下运行得尽可能快,并保持源代码足够简单:)