這是一道經典的題目,先上代碼:
解法1:
function add () {
var args = Array.prototype.slice.call(arguments);
var fn = function () {
var sub_arg = Array.prototype.slice.call(arguments);
// 把全部的參數聚集到參數的入口為一個參數: args.concat(sub_arg)
return add.apply(null, args.concat(sub_arg));
}
fn.valueOf = function () {
return args.reduce(function(a, b) {
return a + b;
})
}
return fn;
}
console.log(add(1,2)) // 3
console.log(add(1)(2)) // 3
console.log(add(1)(2)(3)) // 6
console.log(add(1,2,3)(4)) // 10
解法2:
function add () {
var args = Array.prototype.slice.call(arguments);
var fn = function () {
// 把參數都放在一個相當於全局變量的 args 里面
args.push(...arguments)
return fn;
}
fn.valueOf = function () {
return args.reduce(function(a, b) {
return a + b;
})
}
return fn;
}
console.log(add(1,2)) // 3
console.log(add(1)(2)) // 3
console.log(add(1)(2)(3)) // 6
console.log(add(1,2,3)(4)) // 10
解題的關鍵技術點如下
一. 函數柯里化
柯里化定義:
是把接受多個參數的函數變換成接受一個單一參數的函數,並且返回接受余下的參數而且返回結果是新函數的技術。
對定義的解釋:
對比下平常的函數,都是返回一個結果(具體的值),而柯里化的函數是可以接收多個參數比如 "(1)(2)",並且返回的是一個新的函數(比如代碼里的 fn ),而且這個新函數接收剩下的參數。
二. 自定義修改 valueOf 方法
valueOf簡單來說,就是在console.log(add(1))的時候,會自動調用valueOf方法,我們把它重寫了, 調用的時候,就把 args 這個數組求和返回就是最終結果了。
valueOf的具體講解看這里 https://blog.csdn.net/dapangzi88/article/details/61197937# 講的很好。
參考: https://www.jianshu.com/p/2975c25e4d71 https://blog.csdn.net/dapangzi88/article/details/61197937#