這是因爲funcWrapper中的參數對象爲[function sum(num1, num2){ return num1 + num2; }, 2, 3]
,第一個參數是您傳遞的函數。 arguments
對象是您傳遞給該函數的所有參數。
解決方法是排除作爲對象的第一個參數。通常在JavaScript中,人們使用數組的切片方法。那麼你可能會問自己,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 parameters來解決此問題:
function funcWrapper(func, ...args){
return func.apply(this, args);
};
還有一兩件事,當你正在試圖包裝構造,確保你也繼承了原型過,或者你陷入同樣的陷阱,因爲這問題:jQuery logger plugin
有趣的是,我從來沒有意識到這樣做' + '將函數轉換成字符串的JavaScript,始終以飽滿的。驚喜。 –