第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

關(guān)于最后的立即執(zhí)行函數(shù)和d.onreadystatechange=function(){}不知這樣理解是否有錯(cuò)?

這是我的理解,請大神來指正,否則我真的不知道該怎么理解這些代碼了。(前邊一些代碼略去)首先開始立即執(zhí)行函數(shù),在這個(gè)立即執(zhí)行函數(shù)里是DOM樹創(chuàng)建完成的判斷(它和window.onload有很大區(qū)別,前者是創(chuàng)建DOM樹,onload是不僅樹可能創(chuàng)建完了,還有可能正在加載外部信息),如果DOM樹創(chuàng)建完成跳過try catch執(zhí)行init()也就是css樣式設(shè)置為紅色,如果沒有創(chuàng)建完畢,則執(zhí)行try中的doSCroll捕獲錯(cuò)誤并執(zhí)行catch中的setTimeout,接著利用return跳過該立即執(zhí)行函數(shù),接下來瀏覽器繼續(xù)加載,而代碼執(zhí)行到d.onreadystatechange=function(){}進(jìn)行監(jiān)聽,這種情況下假設(shè)30ms進(jìn)入立即執(zhí)行函數(shù)而48msDOM樹建立完畢,還差18msDOM樹才能建好,于是執(zhí)行了Timesetout并跳出了立即執(zhí)行函數(shù),再假設(shè)49ms網(wǎng)頁加載完畢,而剛好進(jìn)入d.onreadystatechange=function(){}的時(shí)間是49ms,即dom樹建立完畢網(wǎng)頁加載完畢;由于49ms<Settimeout中的50ms因而執(zhí)行了d.onreadystatechange=function(){}中的init函數(shù),于是這是在網(wǎng)頁加載完畢的前提下將CSS設(shè)置為紅色。情況二:我們依舊假設(shè)48msDOM樹建立完畢,但是網(wǎng)頁加載完是51ms,進(jìn)入立即執(zhí)行函數(shù)的時(shí)間是30ms此時(shí)30ms<48ms<50ms這意味DOM樹沒有建立,繼續(xù)進(jìn)入到d.onreadystatechange=function(){}時(shí)間為48ms,由于網(wǎng)頁未加載完,但時(shí)間已經(jīng)走入到了50ms開始執(zhí)行setTimeout這個(gè)遞歸,此時(shí)50ms>48ms(另一邊網(wǎng)頁加載也在進(jìn)行)DOM樹已經(jīng)建立完畢,這時(shí)執(zhí)行立即調(diào)用函數(shù)里的init(),而后網(wǎng)頁加載完成了。

也就是說2個(gè)init()分別對應(yīng)DOM樹建立好了,而網(wǎng)頁不一定加載完的情況下調(diào)用init(),和網(wǎng)頁以及DOM樹都加載好了后調(diào)用init()函數(shù)這2種大情況?

閑話太多,望大神給個(gè)評價(jià)我的理解方式是否正確?

正在回答

2 回答

1,onload事件不是有可能正在加載外部信息,而是必須等外部數(shù)據(jù)全部加載完才能觸發(fā)。

2,return是用來跳出setTimeout所創(chuàng)建的遞歸函數(shù)的外層,在外層阻止運(yùn)行init(),但是當(dāng)這個(gè)遞歸執(zhí)行到調(diào)用doScroll不拋出錯(cuò)誤的時(shí)候(也就是DOMReady的時(shí)候)就沒有return了,此時(shí)會執(zhí)行一次init()。而不是題住理解的return直接跳過了一次性函數(shù)去執(zhí)行后面的readystatechang事件監(jiān)聽。因此,只要順利,這個(gè)一次性函數(shù)里的init()是一定會被調(diào)用一次的。而且實(shí)際應(yīng)用中setTimeout的第二次參數(shù)是0(瀏覽器最短時(shí)間內(nèi)重復(fù)執(zhí)行)而不是50。

3,d.onreadystatechange=function(){}是綁定事件處理函數(shù),這個(gè)綁定過程是在函數(shù)編譯的時(shí)候就完成的,至于觸發(fā)這個(gè)事件,則是document.readyState發(fā)生變化時(shí)觸發(fā),因此題主的表述是有點(diǎn)問題的,當(dāng)readyState為"complete"時(shí),這個(gè)事件監(jiān)聽函數(shù)里的init()也是一定會被調(diào)用一次的。

綜合2和3,確實(shí)是在比兩個(gè)邏輯誰快,但理論上肯定是2的邏輯更快,至于為什么要有3,我印象中是為了應(yīng)付沒有實(shí)現(xiàn)DOMContentLoaded也沒有document.documentElement.doScroll在DOM沒準(zhǔn)備好時(shí)會報(bào)錯(cuò)的特性(這個(gè)特性只有低版本的IE有)的非IE瀏覽器準(zhǔn)備的。


以上是我的理解,歡迎指正~

1 回復(fù) 有任何疑惑可以回復(fù)我~
#1

慕粉3988711 提問者

答案3我看了老師后邊的視頻,如您所說;對于答案2的return;由于JS基礎(chǔ),JS進(jìn)階以及深入淺出JS都沒有細(xì)講return;于是我百度了下return;這意味著return會退出當(dāng)前函數(shù),但是由于沒有Ready,catch中的遞歸會無限次的調(diào)用這個(gè)立即函數(shù),除非你設(shè)置了條件(譬如if判斷等)跳出遞歸,但是假設(shè)Ready完畢,遞歸再次進(jìn)入try塊發(fā)現(xiàn)doScroll為true,于是會跳過catch執(zhí)行init()并跳出立即執(zhí)行函數(shù),我想問一下return在這次代碼中可以不用啊,為什么還要加return?。?/div>
2016-10-30 回復(fù) 有任何疑惑可以回復(fù)我~
#2

慕粉3988711 提問者

我又想了一下,假設(shè)進(jìn)入立即函數(shù)為1,try為2,catch為3,init為4,立即執(zhí)行函數(shù)進(jìn)行了2次發(fā)現(xiàn)DOMReady再執(zhí)行init(),那么順序是123-124,由于return需要按層次返回調(diào)用的函數(shù)而且調(diào)用函數(shù)正是函數(shù)本身所以還有個(gè)返回過程為421-321然后才真正的跳出這個(gè)立即執(zhí)行函數(shù),請問這樣理解return 對不對?
2016-10-30 回復(fù) 有任何疑惑可以回復(fù)我~
#3

慕粉3988711 提問者

非常感謝!
2016-10-31 回復(fù) 有任何疑惑可以回復(fù)我~
#4

姜素源3788549

講的真好!
2017-01-26 回復(fù) 有任何疑惑可以回復(fù)我~
查看1條回復(fù)

上面的表述有點(diǎn)語病,重新整理了一下,去掉了題主問題中本身表述有誤的部分。

1,return是用來跳出setTimeout所創(chuàng)建的遞歸函數(shù)的外層,在外層阻止運(yùn)行init(),但是當(dāng)這個(gè)遞歸執(zhí)行到調(diào)用doScroll不拋出錯(cuò)誤的時(shí)候(也就是DOMReady的時(shí)候)就沒有return了,此時(shí)會執(zhí)行一次init()。因此,只要順利,這個(gè)一次性函數(shù)里的init()是一定會被調(diào)用一次的。而且實(shí)際應(yīng)用中setTimeout的第二次參數(shù)是0(瀏覽器最短時(shí)間內(nèi)重復(fù)執(zhí)行)而不是50。

2,d.onreadystatechange=function(){}是綁定事件處理函數(shù),這個(gè)綁定過程是在函數(shù)編譯的時(shí)候就完成的,運(yùn)行過程中document.readyState發(fā)生變化時(shí)會觸發(fā)事件來運(yùn)行調(diào)用監(jiān)聽函數(shù),當(dāng)readyState為"complete"時(shí),這個(gè)事件監(jiān)聽函數(shù)里的init()也是一定會被調(diào)用一次的。

綜合1和2,有點(diǎn)像是在比誰更快,但理論上肯定是1的更快,至于為什么要有2,我印象中是為了應(yīng)付沒有實(shí)現(xiàn)DOMContentLoaded也沒有document.documentElement.doScroll在DOM沒準(zhǔn)備好時(shí)會報(bào)錯(cuò)的特性(這個(gè)特性只有低版本的IE有)的非IE瀏覽器的,而不是兩個(gè)邏輯代碼都是為低版本IE準(zhǔn)備的。


3 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

關(guān)于最后的立即執(zhí)行函數(shù)和d.onreadystatechange=function(){}不知這樣理解是否有錯(cuò)?

我要回答 關(guān)注問題
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號