回調函數,阻塞和非阻塞對於初學者來說總是一些不好理解的東西,最好的辦法就是通過實際寫代碼去體會。筆者今天就通過一個例子來簡單解釋一下JS的非阻塞,分享分享我的理解。
首先回調函數:這是一個異步過程,簡單說就是,在一個函數的執行過程中,我去做我該做的事,在這期間我不管你,你可以去做你的事。但是當我做完我的事,之后,我就得通知你,接下來就看你的了。
比如:
function doSomething (callback) {
//在這里你可以做你的事。
callback("PengL");
}
function callbackFunc(name)
{
alert("I am "+name);
}
doSomething(callbackFunc);
這里就展現了一個基本的回調函數。
然后非阻塞:正是因為有了回調函數我們才能達到非阻塞的目的,非阻塞就是我在一刻不停得做事,一直不停下來。
我們來看個例子吧
console.log("程序時間:"+new Date().getTime());
setTimeout(function () {
console.log("暫停一秒:"+new Date().getTime());
}, 1000);
console.log('這是暫停一秒之后的時間:'+new Date().getTime());
從這里我們可以看到執行的順序是第一個console.log之后,遇到setTimeout,然后直接去執行第三個console.log,一秒后再來執行中間的那個。這個和java或者C#,C++都不一樣。這就是非阻塞,當遇到需要等待的時候,直接跳過,等這邊完了,再來執行。所以當我們在寫代碼時,就得注意一下這個特性,比如筆者最開始學的java面向對象編程,到了js這邊開始遇到這樣的問題還不知道怎么回事。
比如在c#中
console.writeLine("現在的時間"+DateTime.Now.ToString("HH:mm:ss"));
Thread.Sleep(1000);
console.writeLine("現在的時間"+DateTime.Now.ToString("HH:mm:ss"));
程序就會真的等一秒再執行下一步。這就是阻塞。