所謂回呼函式(callback function)與一般函式基本相同,差別在於它須「具一定條件後」,才會「被動執行」:
實際上,這就是「把一個函式當作另一個函式」使用的參數,如前文所提到的,包括時間控制在內**「高階函式」**。
如下例,把 a 函式傳入 b 函式,稍後呼叫之:
function b(a) {
if (typeof () == “function” ) {
return a()}
}
const a = () => {
return console.log("123")
}
b(a) // 回傳 123
若想要控制複數函式間的執行順序(如:解決setTimeout造成的順序異動),也能活用回呼函式。意者可參考:
https://medium.com/appxtech/%E4%BB%80%E9%BA%BC%E6%98%AFcallback%E5%87%BD%E5%BC%8F-callback-function-3a0a972d5f82
對每個元素做事情,並收集成一個新陣列,回傳值 = 新陣列。例:
const lists = [4, 2, 1, 4, 6, 8, 7]
let result = lists.map(x => {
if (x > 3) {
return x * 3
} else {
return x
}
})
console.log(result)
console.log (lists.map ( (x) => x * 2) )
let result = (lists.map ( (x) => x * 2) )
console.log (result)
對每個元素做事情,不會變成新陣列,回傳值 = undefined。
針對數字加減時需要(不能用迴圈)。例:
let top = 0
Heroes.forEach((hero) => {
if (hero.power > top){
top=hero.power
}
})
console.log(top);
條件成立的就留下來,並收集成一個新陣列,回傳值 = 新陣列。
回傳值只要是true就會保留,但索引值0是false。例:
const lists = [4, 2, 1, 4, 6, 8, 7]
let a = lists.filter( (n) => n > 3)
.map((n) => n*2)
console.log(a)
歸納、簡化。常用來加總數值。
通常設acc預設值為0。若不設預設值,則取陣列第一個當acc,第二個當cv的開頭。
具體上,將陣列的每個元素傳到 callback 進行運算,並回傳一個單一值。
acc=累加值、currentValue=目前值。
const lists = [4, 2, 1, 4, 6, 8, 7] //每回的目前值
.reduce( (acc, currentValue) => {
return 1 //每圈開始的累加值=下一輪的acc。若設return acc + currentValue 就會累加。
} , 0 ) //第一圈的累加值起始值0
宣告reducer的寫法:
function reducer (acc, currentValue) {
return acc + currentValue
}
let r = lists.reducer(reducer, 0)
console.log(r)
注意:
IIFE全名「Immediately Invoked Function Expression」,這是一種不用宣告,立即定義,馬上執行的函式。
具體寫法,是在函式尾端加上一組小括號 () ,可以帶引數進去,一併呼叫。如:
(function() {} )()
此外,jQuery 是個大 IIFE,意者可再深入研究之。