By Huaying Tsai
in
Web Development
—
Web Development 網站開發 (8) - Javascript 非同步:Function and Callback
Callback 是 Javascript 的一個特色。簡單來說就是把一個 function 當作另一個 function 的參數傳進去。其他的程式語言也有類似的方法,但在 Javascript 裡應該是使用最多的。我想原因應該是來自於其使用的場景,Javascript 原先就是用來開發網頁的,需要監聽來自於使用者的各種操作並作出即時的響應,非同步搭配 Callback 的設計能很好的執行任務。
Callback 是 Javascript 的一個特色。簡單來說就是把一個 function 當作另一個 function 的參數傳進去。其他的程式語言也有類似的方法,但在 Javascript 裡應該是使用最多的。我想原因應該是來自於其使用的場景,Javascript 原先就是用來開發網頁的,需要監聽來自於使用者的各種操作並作出即時的響應,非同步搭配 Callback 的設計能很好的執行任務。
Function
在 Javascript 裡的 function 有各式各樣的寫法。有基本的、匿名的還有 arrow function 等,可以直接看一下例子:
以上我們知道了 function 是一個 object 所以可以被 assign 進一個變數裡。那既然變數可以被當作參數傳進 function 裡,代表說我們可以把一個 function 當成參數傳進另一個 function 裡!
Callback
以上 function call function 就是 Callback 的核心概念,如果要問為什麼 Callback 在 Javascript 的世界裡這麼重要的話,大概就是因為 Javascript 是一個 single threaded 的語言。
大部分的語言要同時執行多件事都是開 multi threads,讓不同的任務在不同的 threads 裡執行。Javascript 只有一個 thread ,如果要在相近的時間內執行多個任務,就必須要用 callback 的方式。這邊做一個完後 callback 回去做另一個,再搭配 event loop 來達成這種 “非同步” 的行為。 (event loop的話題也很有趣,可能需要另外一個篇幅來解釋)
可以看看一個有 forEach 功能的 function 是怎麼實現出來的:
最後面不得不提到最常用的事件監聽,用戶的操作可以在任何時間點發生,我以我們的事件監聽 Function 理所當然是非同步,需要給一個 Callback 去處理事件。
const button = document.getElementById('button1');
// 這裡的 addEventListenr 帶了兩個參數 (第三個後省略),第一個是監聽的事件,
// 第二個是一個匿名的 callback function。
// 當這個按鈕點擊時,callback function 會被呼叫,所以執行 line7 的視窗彈跳。
button.addEventListener('click', function() {
alert('button1 is clicked');
})
const input = document.getElementById('username_input');
// keypress 是鍵盤按下的事件偵測,假如今天有人在 username_input 這個 input
// 裡打字了那這裡的 callback function 就會被觸發
input.addEventListener('keypress', function(event) {
// do something
});
// 事件有非常多種,滑鼠滾動、滑鼠移動、圖片加載完成、頁面加載完成等各式各樣的事件
// 可以參考這裡 https://developer.mozilla.org/en-US/docs/Web/API/Event/type