單線程,可是js的引擎不僅有一個線程,還能夠其餘任務線程;
事件驅動:觸發事件就執行。
採用事件循環機制,先將主線的任務(同步)執行完畢,在執行隊列任務(異步)。不斷這樣循環執行。
node非阻塞I/O模型:將循環查看是否有任務隊列(其餘線程)中是否有任務等待;異步I/O。javascript
同步任務:主線程將代碼一步步執行下來,須要等待。
異步任務:引擎會將異步代碼放在另任務隊列中,等待同步的代碼執行完畢,才進行異步代碼的執行。java
eg:node
function f1(){ console.log(1) } function f2(){ console.log(2) } f1() f2() //上述代碼是同步的,因此f2須要f1執行完纔會執行。 //改爲異步,就是將f2改爲f1的回調。 function f1(){ console.log(1) } function f2(){ console.log(2) } f1(f2); //f1(f2())
事件驅動機制,就是綁定一個事件,觸發該事件後才執行。列如,js的addEventListener、jquery的on()方法、定時器、jquery
//js window.addEventListener("click",function(){ alert(1111) }) window.click(); //jquery f1.on("success",f2) function f1(){ ajax(url,function(){ f1.trigger("success") }) } //jquery f1.on("done",f2); function f1(){ setTimeout(function(){ f1.triggle("success"); },1000) } //定時器 var num=1; setTimeout(function f2(){ num++; console.log(num); }) console.log(num);
結論:能夠綁定多個監聽事件;造成多個回調,利於模塊化。可是因爲事件驅動,因此很難看出主流程。es6
事件徹底能夠理解爲「信號」,若是存在一個「信號中心」,某個任務執行完成,就向事件中心」發佈「。其餘任務則向」信號中心「詢問狀況。從而知道何時本身能夠開始。ajax
//利用jquery的插件實現 //首先,f2向消息中心訂閱success事件 jQuery.subscribe('success',f2); //對f1進行改寫: function f1(){ ajax(url,() => { //todo jQuery.publish('success');//當f1執行完畢後,向消息中心jQuery發佈success事件,從而執行f2函數 }) } //f2執行完畢後,能夠取消訂閱 jQuery.unsubscribe('success',f2)
es6語法異步