非同步 JavaScript
"稍後完成!"
與其它函式並行執行的函式稱為非同步函式
JavaScript setTimeout() 是一個很好的例子
非同步 JavaScript
上一章使用的示例非常簡化。
示例的目的是演示回撥函式的語法
示例
function myDisplayer(something) {
document.getElementById("demo").innerHTML = something;
}
function myCalculator(num1, num2, myCallback) {
let sum = num1 + num2;
myCallback(sum);
}
myCalculator(5, 5, myDisplayer);
在上面的示例中,myDisplayer
是一個函式的名稱。
它作為引數傳遞給 myCalculator()
。
在實際應用中,回撥函式最常用於非同步函式。
一個典型的例子是 JavaScript 的 setTimeout()
。
等待超時
使用 JavaScript 函式 setTimeout()
時,你可以指定一個回撥函式在超時後執行
示例
setTimeout(myFunction, 3000);
function myFunction() {
document.getElementById("demo").innerHTML = "我愛你!!";
}
在上面的示例中,myFunction
被用作回撥函式。
myFunction
作為引數傳遞給 setTimeout()
。
3000 是超時前的毫秒數,所以 myFunction()
將在 3 秒後被呼叫。
注意
將函式作為引數傳遞時,請記住不要使用括號。
正確:setTimeout(myFunction, 3000);
錯誤:setTimeout(myFunction(), 3000);
與其將一個函式的名稱作為引數傳遞給另一個函式,不如始終傳遞整個函式
示例
setTimeout(function() { myFunction("我愛你!!!"); }, 3000);
function myFunction(value) {
document.getElementById("demo").innerHTML = value;
}
在上面的示例中,function(){ myFunction("I love You !!!"); }
被用作回撥函式。它是一個完整的函式。整個函式作為引數傳遞給 setTimeout()。
3000 是超時前的毫秒數,所以 myFunction()
將在 3 秒後被呼叫。
等待間隔
使用 JavaScript 函式 setInterval()
時,你可以指定一個回撥函式在每個間隔執行
示例
setInterval(myFunction, 1000);
function myFunction() {
let d = new Date();
document.getElementById("demo").innerHTML=
d.getHours() + ":" +
d.getMinutes() + ":" +
d.getSeconds();
}
在上面的示例中,myFunction
被用作回撥函式。
myFunction
作為引數傳遞給 setInterval()
。
1000 是間隔之間的毫秒數,所以 myFunction()
將每秒呼叫一次。
回撥函式的替代方案
透過非同步程式設計,JavaScript 程式可以啟動耗時任務,並繼續並行執行其他任務。
但是,非同步程式很難編寫和除錯。
因此,大多數現代非同步 JavaScript 方法不使用回撥函式。相反,在 JavaScript 中,非同步程式設計使用Promises 來解決。
注意
你將在本教程的下一章中學習 Promise。