只是個人理解膳犹,如果不妥當,還請批評指正签则。
同步:多件事情的結果是按我們預期的順序依次發(fā)生须床。異步:多件事情的結果的順序并不可控。
同步
如下js代碼是同步的:
console.info("1");
console.info("2");
console.info("3");
它們輸出的結果一定是按我們書寫的順序來的渐裂,即先輸出1豺旬,再輸出2钠惩,最后是3。
同步的優(yōu)點:
一切盡在掌握族阅,嚴格按我們的預期來篓跛。
同步的缺點:
阻塞
f1();
f2();
f3();
上面的三個函數(shù)調(diào)用過程肯定是同步的:先執(zhí)行f1,再執(zhí)行f2,再執(zhí)行f3耘分。換句話說举塔,如果f1這個函數(shù)需要1個小時才能執(zhí)行完,則f2就要等1個小時求泰。
這為什么是缺點呢?舉個小例子:
生活中的泡茶為例:
1.燒水();
2.洗杯子();
3.泡茶()计盒;
4.喝茶()渴频;
如果第一步燒水需要花20分鐘,你會在水壺旁邊干等20分鐘嗎北启? 肯定不會的卜朗,你應該趁炒水的空去做第二步。在這里如果按同步的思想咕村,你就只能等20分鐘场钉!
另外一個例子:
把如下代碼寫在一個單獨的js文件中,名為while.js.
//while.js
var t = Date.now();
while( Date.now() - t < 5000){
}
alert("while.js done!")
上面的代碼的功能是讓整個代碼空等5秒懈涛。在5s秒之后再彈出一個框逛万。
另外新建一個html文件,代碼大致如下:
<head>
<script src="while.js">
</head>
<body>
![](http://upload-images.jianshu.io/upload_images/4071608-baa1f1bf64c3d798.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</body>
有兩點要注意:
- while.js寫在head中批钠。這意味著瀏覽器會先載入這個空等5秒的js文件宇植。
- 在body中,我們需要請求一個img圖片埋心。
結果是:頁面被這個while.js"阻塞"了,在整個頁面打開5秒之后指郁,才去請求圖片畦戒!
這個例子告訴我們:
- 如果js文件與頁面上的元素關系不大仓技,則不要寫在head中兽狭,而應該寫在body的最后:在整體dom元素之后去加載肛炮。
- 阻塞并不是一件好事寥院。
異步
異步:多件事情的結果的順序并不可控肤无。
例1:請求圖片
![](http://upload-images.jianshu.io/upload_images/4071608-baa1f1bf64c3d798.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/4071608-b1ea8a03990a563c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
你要請求兩張圖刁俭,dom中的書寫順序是第一張帐姻,然后第二張啥供。但最后到底是哪張圖先請求回來悯恍,不確定!
例2:setTimeout
console.log( "a" );
setTimeout(function() {
console.log( "c" )
}, 500 );
setTimeout(function() {
console.log( "d" )
}, 300 );
setTimeout(function() {
console.log( "e" )
}, 200 );
console.log( "b" );
考慮如上代碼的輸出情況伙狐。結果大概是:
a b 約200ms e 約100ms d 約200ms c
這里有兩點要注意:
- 輸出語句的代碼書寫順序與最終輸出的結果的順序并不一致(異步)涮毫。
- 為什么是"約"而不是"肯定"瞬欧?因為我們不能確定每個setTimeout的函數(shù)體內(nèi)部的代碼需要多長時間才能執(zhí)行完成。例如: 你試著在console.log("e")的前面加一個空等3s的while循環(huán)試試罢防?