iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

追憶JS年華系列 第 16

Day-16 回呼函式、高階函式與IIFE

  • 分享至 

  • xImage
  •  

回呼函式

所謂回呼函式(callback function)與一般函式基本相同,差別在於它須「具一定條件後」,才會「被動執行」:

  1. 達成條件,然後執行的函式。
  2. 一個函式執行完,再去執行另一個函式。

實際上,這就是「把一個函式當作另一個函式」使用的參數,如前文所提到的,包括時間控制在內**「高階函式」**。

如下例,把 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

更多高階函式

map 新陣列

對每個元素做事情,並收集成一個新陣列,回傳值 = 新陣列。例:

  • 把大於 3 的數字乘以 3 倍
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)
  • 全部x乘以2
console.log (lists.map ( (x) => x * 2) )
  • 全部x乘以2(宣告變數result)
let result = (lists.map ( (x) => x * 2) )
console.log (result)

forEach 迴圈

對每個元素做事情,不會變成新陣列,回傳值 = undefined。
針對數字加減時需要(不能用迴圈)。例:

  • 判定迴圈heroes最大值
let top = 0
Heroes.forEach((hero) => {
    if (hero.power > top){
	    top=hero.power
    }
 })
console.log(top);

filter 過濾器

條件成立的就留下來,並收集成一個新陣列,回傳值 = 新陣列。
回傳值只要是true就會保留,但索引值0是false。例:

  • 選出大於3的數字乘以2
const lists = [4, 2, 1, 4, 6, 8, 7]
let a = lists.filter( (n) => n > 3)
	.map((n) => n*2)
console.log(a)

reduce 歸納

歸納、簡化。常用來加總數值。
通常設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)

注意:

  • reduce 本身及callback都有兩個參數要帶入。
  • 起始值沒給的話,會直接將第一個數當成起始值,currentValue 會從第二個數開始拿。
  • 每一輪結束後的 return 值是下一輪的 累加值acc。

立即呼叫函式表達式 IIFE

IIFE全名「Immediately Invoked Function Expression」,這是一種不用宣告,立即定義,馬上執行的函式。

具體寫法,是在函式尾端加上一組小括號 () ,可以帶引數進去,一併呼叫。如:

(function() {} )()

此外,jQuery 是個大 IIFE,意者可再深入研究之。


上一篇
Day-15 函式的參數與常用方法
下一篇
Day-17 同步、非同步與事件循環
系列文
追憶JS年華30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言