这是因为 funcWrapper 中的 arguments 对象是[function sum(num1, num2){ return num1 + num2; }, 2, 3]
,第一个参数是你传递的函数。arguments
对象是您传递给函数的所有参数。
解决方案是排除作为对象的第一个参数。通常在 javascript 中,人们使用数组的 slice 方法。那么你可能会问自己那arguments
是一个对象,并且没有那个方法。但是我们可以做以下解决方法:
var args = Array.prototype.slice.call(arguments, 1);
return func.apply(this, args);
在 funcWrapper 中。通过将第一行转换为:
var args = [].slice.call(arguments, 1);
return func.apply(this, args);
您也可以将其包装成这样的函数:
function _slice(obj, start, end) {
return [].slice.call(obj, start, end);
}
并像这样使用它:
var args = _slice(arguments, 1);
请注意,在 ES6(未在浏览器中实现)中,这个问题是通过使用rest 参数来解决的:
function funcWrapper(func, ...args){
return func.apply(this, args);
};
还有一件事,当您尝试包装构造函数时,请确保您也继承原型,否则您会陷入与此问题相同的陷阱:jQuery logger plugin