柯里化箭頭函式埋坑記
阿新 • • 發佈:2018-12-22
今天寫了個累加的柯里化函式如下:
function add(){
let that = this;
let arrs = Array.prototype.slice.call(arguments)
function fn(){
return add.apply(that, arrs.concat(Array.prototype.slice.call(arguments)));
};
fn.toString = function (){
let all = 0;
for (var i = 0; i < arrs.length; i++) {
var element = arrs[i];
all += element;
}
return all;
}
return fn;
}
然後執行 console.log(add(1)(2)(3))
列印 ƒ 6
其中的f可能是谷歌瀏覽器自己加的。
但是把函式裡面的fn修改成如下箭頭函式:
var fn = () => {
return add.apply(that, arrs.concat(Array.prototype.slice.call(arguments)));
};
結果執行結果是 ƒ 4
為什麼會是這個樣子呢?
這是因為忽略了箭頭函式和普通函式的一個很大的區別(當然不是
this
的指向問題),就是箭頭函式沒有 arguments
物件。 所以每次呼叫的
arguments
都是最開始時候的引數,也就是上面的1,然後這裡總共呼叫了3次函式,加上剛開始的時候初始化的一次所以共使用了四次第一個引數,也就是 1+1+1+1
也就是 4
。