需求
實作sum函式,使其可以傳入不定長引數,以及不定次數呼叫
//示例
console.log(sum(1,2)(3)()) //6
console.log(sum(2,3,4,5)(1,2)(3)(4)()) //23
需求分析
實作sum函式我們可以考慮可以使用閉包的形式來實作
-
因為每次傳參,所以我們不知道這是不是最后一次,如果是最后一個括號,則就要執行
-
我們可以通過每次呼叫時對傳入引數的個數來判斷目前是否是最后一個括號
-
如果有引數就說明是呼叫,那么我們就將引數保存到外面的容器中
-
如果沒有引數則說明是呼叫
-
如果最后是呼叫時,我們只需要將所有的引數累加即可
function add (...args) {
return args.reduce((pre, cur) => pre + cur)
}
function currying (fn) {
// 作為引數存盤的容器
let argArr = []
// 中間容器,用來判斷傳入是否有傳入引數
return function temp (...arg) {
// 只要傳入的引數不為0,就繼續將引數交給容器
if (arg.length) {
// 使用擴展運算子,將result中的值進行更新
argArr = [...argArr, ...arg]
return temp
}
// 如果沒有引數的話則說明是最后一個括號,也就是執行
else {
let val = fn(...argArr)
argArr = []
return val
}
}
}
let sum = currying(add)
console.log(sum(1, 2, 3, 4)(1)()) //15
console.log(sum(1,2)(3)()) //6
reduce回顧
reduce陣列方法,接收兩個引數,第一個為一個累加器函式,第二個引數為初始值
比如對陣列累加,我們如果不設定初始值,也就是不設定第二個引數,那么累加器中
第一個引數pre就是陣列的第一個元素,cur就是第二個元素,也就是第一次就會訪問到
陣列的第一個和第二個元素
如果傳遞了初始值,那么陣列索引就會從0開始,也就是第一個cur是陣列第一個元素,
pre為傳遞的初始值
通俗一點來說:
如果不寫初始值,那么元素累加就從索引為1開始,初始值默認為陣列第一個元素
寫上初始值就從索引為0開始,
累加函式有四個引數(preValue,curValue,index,arr)
每一項都要有一個回傳值
閉包回顧
閉包的一般形式就是函式回傳函式,在內層函式中可以訪問外層函式中的變數
這樣可以延長變數的作用域,使得變數可以長期保存,比如我們在這個案例中使用閉包
來保存每次傳遞的引數,閉包可能會造成記憶體泄露,其它造成記憶體泄漏的場景還有:
- 沒有被清理的定時器
- 意外的全域變數
- 沒有清理對DOM的參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519081.html
標籤:其他
上一篇:js中的防抖和節流
