async與defer的區(qū)別

script執(zhí)行

瀏覽器在執(zhí)行HTML的時(shí)候如果遇到<script>時(shí)會(huì)停止頁面的渲染,去下載和執(zhí)行js的文件直接遇見</scirpt>會(huì)繼續(xù)渲染頁面从祝。故瀏覽器在執(zhí)行js文件的時(shí)候?yàn)g覽器表現(xiàn)為一片空白,為了解決這個(gè)問題ECMAScript定義了defer和async兩個(gè)屬性用于控制JS的下載和執(zhí)行

async是在HTML5中加入的

defer

defer

對(duì)于defer怜跑,我們可以認(rèn)為是將外鏈的js放在了頁面底部名船。js的加載不會(huì)阻塞頁面的渲染和資源的加載。不過defer會(huì)按照原本的js的順序執(zhí)行,所以如果前后有依賴關(guān)系的js可以放心使用

async

async

和defer一樣,會(huì)等待的資源不會(huì)阻塞其余資源的加載崎弃,也不會(huì)影響頁面的加載甘晤。但是有一點(diǎn)需要注意下,在有async的情況下饲做,js一旦下載好了就會(huì)執(zhí)行线婚,所以很有可能不是按照原本的順序來執(zhí)行的。如果js前后有依賴性盆均,用async塞弊,就很有可能出錯(cuò)。

區(qū)別

相同點(diǎn):

  • 加載文件時(shí)不阻塞頁面渲染
  • 對(duì)于inline的script無效
  • 使用這兩個(gè)屬性的腳本中不能調(diào)用document.write方法
  • 有腳本的onload的事件回調(diào)

區(qū)別點(diǎn):

  • html4.0中定義了defer泪姨;html5.0中定義了async
  • 瀏覽器支持不同
  • 每一個(gè)async屬性的腳本都在它下載結(jié)束之后立刻執(zhí)行游沿,同時(shí)會(huì)在window的load事件之前執(zhí)行。所以就有可能出現(xiàn)腳本執(zhí)行順序被打亂的情況驴娃;每一個(gè)defer屬性的腳本都是在頁面解析完畢之后奏候,按照原本的順序執(zhí)行,同時(shí)會(huì)在document的DOMContentLoaded之前執(zhí)行唇敞。

簡(jiǎn)單的來說蔗草,使用這兩個(gè)屬性會(huì)有三種可能的情況

  • 如果async為true,那么腳本在下載完成后異步執(zhí)行疆柔。
  • 如果async為false咒精,defer為true,那么腳本會(huì)在頁面解析完畢之后執(zhí)行旷档。
  • 如果async和defer都為false模叙,那么腳本會(huì)在頁面解析中,停止頁面解析鞋屈,立刻下載并且執(zhí)行

無論使用defer還是async屬性范咨,都需要首先將頁面中的js文件進(jìn)行整理,哪些文件之間有依賴性厂庇,哪些文件可以延遲加載等等渠啊,做好js代碼的合并和拆分,然后再根據(jù)頁面需要使用這兩個(gè)屬性

疑惑

在《JavaScript高級(jí)程序設(shè)計(jì)》的P13中提到

在現(xiàn)實(shí)中,延遲腳本并不一定會(huì)按照順序執(zhí)行,也不一定會(huì)在DOMContentLoaded事件觸發(fā)前執(zhí)行,因此最好包含一個(gè)延遲腳本

原文如下:

In reality, though, deferred scriptsdon’t always execute in order or before the DOMContentLoaded event, so it’s best to include just onewhen possible.

那么什么情況下defer會(huì)不按照順序執(zhí)行

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末权旷,一起剝皮案震驚了整個(gè)濱河市替蛉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拄氯,老刑警劉巖躲查,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異译柏,居然都是意外死亡镣煮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鄙麦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來典唇,“玉大人邮弹,你說我怎么就攤上這事◎酒福” “怎么了腌乡?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)夜牡。 經(jīng)常有香客問我与纽,道長(zhǎng),這世上最難降的妖魔是什么塘装? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任急迂,我火速辦了婚禮,結(jié)果婚禮上蹦肴,老公的妹妹穿的比我還像新娘僚碎。我一直安慰自己,他們只是感情好阴幌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布勺阐。 她就那樣靜靜地躺著,像睡著了一般矛双。 火紅的嫁衣襯著肌膚如雪渊抽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天议忽,我揣著相機(jī)與錄音懒闷,去河邊找鬼。 笑死栈幸,一個(gè)胖子當(dāng)著我的面吹牛愤估,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播速址,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玩焰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了壳繁?” 一聲冷哼從身側(cè)響起震捣,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤荔棉,失蹤者是張志新(化名)和其女友劉穎闹炉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體润樱,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渣触,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壹若。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅钻。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皂冰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出养篓,到底是詐尸還是另有隱情秃流,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布柳弄,位于F島的核電站舶胀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碧注。R本人自食惡果不足惜嚣伐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萍丐。 院中可真熱鬧轩端,春花似錦、人聲如沸逝变。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壳影。三九已至耿导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間态贤,已是汗流浹背舱呻。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悠汽,地道東北人箱吕。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柿冲,于是被迫代替她去往敵國和親茬高。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 簡(jiǎn)單介紹JavaScript的發(fā)展歷史 JavaScript因互聯(lián)網(wǎng)而生假抄,回顧它的歷史要從瀏覽器的歷史講起怎栽。 19...
    _Dot912閱讀 490評(píng)論 0 3
  • 沒有 defer 或 async,瀏覽器會(huì)立即加載并執(zhí)行指定的腳本宿饱,“立即”指的是在渲染該 script 標(biāo)簽之下...
    饑人谷_Shirley閱讀 952評(píng)論 0 0
  • defer和async是script標(biāo)簽的兩個(gè)屬性熏瞄,用于在不阻塞頁面文檔解析的前提下,控制腳本的下載和執(zhí)行谬以。我們先...
    曾祥輝閱讀 4,900評(píng)論 0 2
  • 本文總結(jié)一下瀏覽器在 javascript 的加載方式强饮。關(guān)鍵詞:異步加載(async loading),延遲加載(...
    4ea0af17fd67閱讀 1,059評(píng)論 0 2
  • 瀏覽器中script標(biāo)簽加載順序是如何的呢为黎?這個(gè)問題折騰了好幾次了邮丰,之前弄清楚了以后行您,覺得做不做筆記的無關(guān)緊要,可...
    世事如煙_f411閱讀 1,523評(píng)論 0 1