一傻工、什么是回調(diào)
回調(diào)是異步編程時(shí)的基礎(chǔ),將后續(xù)邏輯封裝在回調(diào)函數(shù)中作為起始函數(shù)的參數(shù)咙冗,逐層嵌套沾歪,通過這種方式讓程序按照我們所期望的方式執(zhí)行。
function say(something){ //定義回調(diào)函數(shù)
console.log(something);
}
function me(callback,something){ //做為參數(shù)傳遞
something += ' is cool';
callback(something);
}
me(say,'Ray');
me(function(something){ //使用匿名函數(shù)
console.log(something);
},'ms');
二雾消、什么是同步/異步
同步指的是:發(fā)送方發(fā)出數(shù)據(jù)后灾搏,等待接收方發(fā)回響應(yīng)才能發(fā)送下一個(gè)數(shù)據(jù)包的通訊方式。程序的執(zhí)行順序與任務(wù)的排列順序是一致的立润。
var c = 0;
function printS(){
console.log(c);
}
function plus(){
c += 1;
}
plus();
printS(); //1 結(jié)果為1 程序按照順序執(zhí)行
異步是指:發(fā)送方發(fā)出數(shù)據(jù)后狂窑,不等待對(duì)方發(fā)回響應(yīng),接著發(fā)送下一個(gè)數(shù)據(jù)包的通訊方式桑腮。程序的執(zhí)行順序與任務(wù)的排列順序不是一致的泉哈,是異步的,在JS中兩個(gè)異步函數(shù)setTimeout()
和setInterval()
var c = 0;
function printS(){
console.log(c);
}
function plus(){
setTimeout(function(){
c += 1;
},1000);
}
plus();
printS(); //0 結(jié)果為0 程序?yàn)楫惒綀?zhí)行
三、什么是單線程和多線程
一次只能執(zhí)行一個(gè)程序叫做單線程
一次能執(zhí)行多個(gè)程序叫做多線程
四丛晦、什么是IO
磁盤的寫入奕纫、磁盤的讀取就是數(shù)據(jù)的進(jìn)和出,就是IO采呐。
五若锁、什么是阻塞/非阻塞
阻塞:前一個(gè)進(jìn)程沒有執(zhí)行完就一直占用著CPU的資源,其他進(jìn)程一直處于等待的過程斧吐。
非阻塞:前一個(gè)進(jìn)程沒有執(zhí)行完時(shí)可以掛起又固,繼續(xù)執(zhí)行其他進(jìn)程,等到使用時(shí)再執(zhí)行煤率。
六仰冠、什么是事件
事件就是一個(gè)觸發(fā)動(dòng)作,比如點(diǎn)擊按鈕
七蝶糯、什么是事件驅(qū)動(dòng)
事件驅(qū)動(dòng)就是一個(gè)觸發(fā)動(dòng)作引起的操作
八洋只、什么是基于事件驅(qū)動(dòng)的回調(diào)
為了某個(gè)事件注冊(cè)了回調(diào)函數(shù),但是這個(gè)回調(diào)函數(shù)不是馬上執(zhí)行昼捍,只有當(dāng)事件發(fā)生的時(shí)候识虚,才會(huì)調(diào)用回調(diào)函數(shù),這種函數(shù)執(zhí)行的方式叫做事件驅(qū)動(dòng)妒茬,這種注冊(cè)回調(diào)就是基于事件驅(qū)動(dòng)的回調(diào)担锤。
九、什么是事件循環(huán)
管理大量異步操作的機(jī)制叫做事件循環(huán)乍钻。Event Loop是回調(diào)函數(shù)隊(duì)列肛循,異步執(zhí)行的函數(shù)會(huì)被壓入這個(gè)隊(duì)列,隊(duì)列會(huì)被循環(huán)查詢银择。
對(duì)于nodejs來說靠一個(gè)單線程不斷的查詢隊(duì)列中是否有事件多糠,當(dāng)他讀取到一個(gè)事件的時(shí)候,將調(diào)用與這個(gè)事件相關(guān)的JavaScript函數(shù)浩考,那么事件的循環(huán)是一個(gè)先進(jìn)先出的任務(wù)隊(duì)列夹孔,那么回調(diào)就按照他們被加入隊(duì)列的順序來執(zhí)行。