js的三座大山
1.原型和原型鏈
2.作用域和閉包
3.異步和單線程
+變量的類型和計算+后邊的知識
//-------------題目---------------
1.同步和異步的區(qū)別是什么金顿?分別舉一個同步和異步的例子
*同步會阻塞代碼執(zhí)行臊泌,異步不會;
*alert是同步揍拆,setTimeout是異步渠概;
2.一個關于setTimeout的筆試題
//打印順序:1--3--5--2--1秒之后4
console.log(1);
setTimeout(function(){
console.log(2);
},0);
console.log(3);
setTimeout(function(){
console.log(4);
},1000);
console.log(5);
3.前端使用異步的場景有哪些
3個場景的特點是都需要等待,為什么等待需要異步呢,因為等待的過程中不 能有卡頓播揪,不能阻塞贮喧;這一切的方法和設計都是因為js單線程語言決定的,單線程就只允許同時做一件事猪狈,如果想同時做多個箱沦,那其他的都必須去一邊排隊去,先做好一件事把剩余的做完了在做其他的雇庙,這是一個串行的過程
1.定時任務:setTimeout,setInterval
2.網絡請求:ajax請求谓形,動態(tài)<img>加載
3.事件綁定
//---------------知識點-----------------
1.什么是異步(對比同步)
//最大的區(qū)別:有沒有阻塞后面程序的進行
//同步:會阻塞代碼的執(zhí)行
//異步:(我走我的,我走完之后疆前,回來再說)
/*****何時需要異步(什么情況下需要等待寒跳,什么情況需要異步)*******
*在可能發(fā)生等待的情況
(如果需要等待,不能卡在這竹椒,需要等待過程中繼續(xù)去做該做的事情)
*等待過程中不能像alert一樣阻塞程序進行
*因此童太,所有的“等待的情況”都需要異步
2.前端使用異步的場景有哪些
1.定時任務:setTimeout,setInterval
2.網絡請求:ajax請求,動態(tài)<img>加載
*1碾牌、請求一個線上數據需要等待康愤,如果網絡情況好的話儡循,幾十毫秒舶吗、100毫秒就把這個數據拿到了,在計算機中這個一個非常長的時間择膝,這個時間不能卡著誓琼,而且你一個頁面肯定有很多請求,一請求就卡著肴捉,網頁就沒法看了
*2腹侣、如果網絡請求不好的話,一個接口的請求可能有幾秒鐘的時間齿穗,幾秒鐘不能卡著)
*3傲隶、如果網頁中使用了一google的cdn,結果近幾年google在國內不能用了窃页,請求不到我們的頁面不能白著跺株,請求這個事情我們最后不做了,后邊的該怎么做怎么做脖卖,不能因為請求不到就卡著
3.事件綁定
1個點擊事件綁上之后乒省,它什么時候點不知道,但是在它點之前下面該干什么干什么畦木,不能因為用戶不點這個按鈕了袖扛,下面的事情就不做了;綁上之后愛點不點十籍,點了之后是點了之后的事情蛆封,不點還得往下走唇礁。
eg:1.
//先打印100--300,一秒之后打印200
console.log(100);
//等待一秒之后打印出來200
setTimeout(function(){
console.log(200);
},1000);
console.log(300);
eg:2.對比同步
//打印100之后惨篱,彈出框彈出200等待確認垒迂,確認之后再打印300
console.log(100);
alert(200); //在沒有點擊確認之前,300不會被打印出來
console.log(300);
eg:3.ajax請求代碼示例
//打印順序start--end--等著這個請求返回之后在執(zhí)行回調函數打出data1
console.log('start');
$.get('./data1.json',function(data1){
console.log(data1);
});
console.log('end');
eg:4.<img>加載示例
//先打印start--end--先定義一個img妒蛇,img加載完之后打印loaded
console.log('start');
var img = document.createElement('img');
img.onload = function(){
//這個不會執(zhí)行机断,因為它還沒回來,只有等到img加載完之后打印
console.log('loaded');
};
img.src = '/xxx.png';
console.log('end');
eg:5.事件綁定示例
//打印順序:start--end--用戶什么時候觸發(fā)這個事件什么時候打clicked
console.log('start');
document.getElementById('btn1').addEventListener('click',function(){
console.log('clicked');
});
console.log('end');
3.異步和單線程
異步和單線程的關系:
js是個單線程的語言绣夺,單線程一次只能干一件事吏奸,不能讓我干兩件,如果想讓干多件(同時去干兩件事)陶耍,那就必須有一個到一邊排隊去奋蔚,我先干完這個在說,如果沒有異步的話烈钞,就會出現卡頓的情況泊碑;(如果沒有異步干完第一件事,在干第二件事毯欣,第三件事的時候有可能會出現等待的現象馒过,單線程肯定得等著,等著之后就會出現卡頓酗钞,只有異步才能搞定這個問題腹忽,想等著就去后邊等著,先把接下來的事情搞定之后在去處理等待這個事情)
js之所以是異步砚作,因為它是單線程執(zhí)行的語言窘奏,必須有異步
單線程:一次只能干一件事(一次不能同時干兩件事),如果想只能是一個一個排隊來葫录,每個函數拿來就坐著着裹,哪行程序拿來就執(zhí)行哪一行
eg:1.打印順序:100--300---200
/*
*執(zhí)行第一行打印100;
*執(zhí)行setTimeout后米同,傳入setTimeout的函數會被暫存起來骇扇,不會立即執(zhí)行(單線程的特點,不能同時干兩件事)窍霞;
*執(zhí)行最后一行匠题,打印300;
*待所有程序執(zhí)行完但金,處于空閑狀態(tài)時韭山,會立馬看有沒有暫存起來的要執(zhí)行;
*發(fā)現暫存起來的setTimeout中的函數無序等待時間,就立即過來行钱磅。
*/
console.log(100);
//setTimeout是異步的場景梦裂,所有的異步的陳述都會被拿出去暫時不執(zhí)行
//setTimeout函數是個異步,把它其中的函數拿出來盖淡,放一邊等著年柠;
在往下執(zhí)行完300,這個時候確定程序都已經執(zhí)行完之后褪迟,在把之前那個函數拿過來看看;確認它是不是可以立即執(zhí)行冗恨,因為這個setTimeout這個后邊沒有加等待時間,它可以立即執(zhí)行味赃,那200執(zhí)行
setTimeout(function(){
console.log(200);
});
console.log(300);
eg:2.setTimeout有延遲時間
//打印順序:100--setTimeout里面函數先暫存起來--300--一秒鐘之后執(zhí) 行setTimeout打印200
console.log(100);
setTimeout(function(){
console.log(200);
},1000);
console.log(300);
eg:3.ajax
//打酉颇ā:start--發(fā)送請求之后等待,里面函數暫存起來--end--發(fā)送請求
回來之后執(zhí)行打印data
console.log('start');
$.get('./data1.json',function(data){
console.log(data);
});
console.log('end');
eg:4.事件
//打有乃住:start--綁定事件的回調函數暫存起來--end--點擊的時候才能解封執(zhí)行clicked
console.log('start');
document.getElementById('btn1').addEventListener('click',function(){
alert('clicked');
});
console.log('end');