瀏覽器的事件輪詢
首先js是單線程的,js異步是瀏覽器事件輪詢的結(jié)果。
事件輪詢的字面意思就是事件循環(huán)媚送。
事件輪詢的步驟:
- 所有同步的任務(wù)都在主線程上運(yùn)行,形成一個(gè)執(zhí)行棧寇甸。
- 遇到事件塘偎、ajax、settimeout時(shí)會(huì)把它們放入一個(gè)叫做‘任務(wù)隊(duì)列’里拿霉。遵循先進(jìn)先出的原則吟秩。
- 等主線程上的任務(wù)完成后,就會(huì)把任務(wù)隊(duì)列里面的任務(wù)放到主線程上來進(jìn)行執(zhí)行绽淘。
- 主線程不斷地執(zhí)行上面第三步涵防。
同步和異步
同步和異步的定義
同步情況下,后面的代碼必須要等到前面的代碼執(zhí)行結(jié)束并返回結(jié)果才執(zhí)行收恢。也就是a-b-c武学。
異步情況下祭往,不等任務(wù)執(zhí)行完,直接執(zhí)行下一個(gè)任務(wù)火窒,而異步函數(shù)會(huì)在新線程中去執(zhí)行硼补,執(zhí)行結(jié)束后會(huì)放在一個(gè)回調(diào)函數(shù)中進(jìn)行處理⊙螅回調(diào)函數(shù)的作用是獲取函數(shù)的執(zhí)行結(jié)果已骇,并進(jìn)行之后的處理。
回調(diào)函數(shù)與異步
回調(diào)函數(shù)和同步異步?jīng)]有任何關(guān)系票编,只是一般會(huì)通過回調(diào)對(duì)異步函數(shù)傳參褪储,用回調(diào)函數(shù)來處理異步函數(shù)的返回結(jié)果而已。
回調(diào)的形成:在一個(gè)函數(shù)中將另一個(gè)函數(shù)作為參數(shù)傳入進(jìn)去并在此函數(shù)中對(duì)其進(jìn)行調(diào)用慧域。
異步函數(shù)與異步:異步函數(shù)setTimeout和setInterval是最基礎(chǔ)的異步函數(shù)鲤竹。
js中的異步單線程的特性
js并不像其他語言一樣具有多線程特性,js是一門嚴(yán)格單線程運(yùn)行的語言昔榴,這就意味著不存在同一時(shí)間有多段代碼被執(zhí)行的現(xiàn)象辛藻。在某個(gè)特定的時(shí)刻,永遠(yuǎn)只有特定代碼被執(zhí)行互订,并阻塞其他代碼吱肌。
同時(shí),js又是支持異步特性的語言仰禽,異步意味著異步函數(shù)又執(zhí)行后不會(huì)立即得到結(jié)果氮墨,而是等待被調(diào)用者來處理回調(diào)函數(shù),比如用setTimeout異步函數(shù)實(shí)現(xiàn)了在一段時(shí)間后執(zhí)行回調(diào)函數(shù)的異步動(dòng)作吐葵。
異步的單線程之間并不沖突规揪,不沖突的原因是異步本身不是js實(shí)現(xiàn)的,而是由瀏覽器的事件觸發(fā)線程景一個(gè)個(gè)異步任務(wù)插入到事件隊(duì)列中再由js單線程來執(zhí)行温峭。
回調(diào)
概念的理解:當(dāng)用戶調(diào)用系統(tǒng)的api的時(shí)候稱之為調(diào)用粒褒,當(dāng)系統(tǒng)調(diào)用用戶自定義的函數(shù)時(shí)稱之為回調(diào)。代碼的表現(xiàn)形式就是把一個(gè)函數(shù)a作為參數(shù)傳入另一個(gè)函數(shù)b中诚镰,在函數(shù)b中進(jìn)行返回調(diào)用。
function fn1(m,n){
return m(n);
}
function m(num){
return num+10;
}
fn1(m,10)//此處傳的是m祥款,而不是m()
如果傳的是m()則:
function box(num,sum){
return num+sum;
}
function sum(num){
return num+10;
}
box(sum(10),num)//30
類型就是同步回調(diào)和異步回調(diào)
同步回調(diào):
function useless(callback){
return callback();
}
var a=function callback(){
return text;
}
useless(a)
異步回調(diào)主要用于ajax,事件清笨,setTimeout中。
使用比較器進(jìn)行排序
對(duì)數(shù)組[213,23,13,266]中的數(shù)字進(jìn)行排序
var Array=[213,23,13,266]
Array.sort(function(value1,value2){
return value2-vaule1;
}//數(shù)組sort方法的特性就是如果value2-value1是正數(shù)的話則兩個(gè)數(shù)調(diào)換位置刃跛。此處也可以認(rèn)為是回調(diào)抠艾。
對(duì)數(shù)組中的按name進(jìn)行排序
var data=[{name:'lili',age:'10'},{name:'mary',age:'12'}]
function fn2(m){
var object1={
name:'lili',
age:'10'
}
var object2={
name:'mary',
age:'12'
}
function fn1(obj1,obj2){
var value1=obj1[m];
var value2=obj2[m];
if(value1<value2){
return 1;
}else if(value1>value2){
return -1;
}else{
return 0;
}
}
}
data.sort(fn2('name'))//此處比較的是字符串就是比較的編碼值。比較的是name當(dāng)然要傳入name的值桨昙。