null和命令先后問題
<!DOCTYPE HTML>
<html>
<body>
? ? <p id=demo>length 屬性返回字符串的長度:</p>
<script>
? ?var len = document.getElementById("demo").innerHTML.length;
? ?if(len>=18)? //len>=18是判斷條件
? ?{ document.write("字符長度大于等于18。");
? ?document.getElementById("demo").innerHTML=null}//會(huì)隱藏掉<p>里的內(nèi)容,但是還是會(huì)顯示滿足條件后返回的內(nèi)容
? ?else?
? ?{ document.write("字符長度小于18。");}
? ?if(document.getElementById("demo").innerHTML=null)
? ?{document.write("p不在");}
? ? else??
? ?{ alert("p還在");}//明明p不在了,但是卻彈出p還在
</script>
</body>
</html>
問題:alert無論放在JS哪里,都會(huì)最先被執(zhí)行嗎?
2020-04-04
JavaScript執(zhí)行原理:
JavaScript 引擎是單線程運(yùn)行的,瀏覽器無論在什么時(shí)候都只且只有一個(gè)線程在運(yùn)行 JavaScript 程序,初衷是為了減少 DOM 等共享資源的沖突。可是單線程永遠(yuǎn)會(huì)面臨著一個(gè)問題,那就是某一段代碼阻塞會(huì)導(dǎo)致后續(xù)所有的任務(wù)都延遲。又由于 JavaScript 經(jīng)常需要操作頁面 DOM 和發(fā)送 HTTP 請(qǐng)求,這些 I/O 操作耗時(shí)一般都比較長,一旦阻塞,就會(huì)給用戶非常差的使用體驗(yàn)。
于是便有了事件循環(huán)(event loop)的產(chǎn)生,JavaScript 將一些異步操作或 有I/O 阻塞的操作全都放到一個(gè)事件隊(duì)列,先順序執(zhí)行同步 CPU代碼,等到 JavaScript 引擎沒有同步代碼,CPU 空閑下來再讀取事件隊(duì)列的異步事件來
依次
執(zhí)行。分析:
由于頁面渲染是 DOM 操作,會(huì)被 JavaScript 引擎放入事件隊(duì)列;
alert()
?是 window 的內(nèi)置函數(shù),被認(rèn)為是同步 CPU代碼;JavaScript 引擎會(huì)優(yōu)先執(zhí)行同步代碼,alert 彈窗先出現(xiàn);
alert 有特殊的阻塞性質(zhì),JavaScript 引擎的執(zhí)行被阻塞??;
點(diǎn)擊 alert 的“確定”,JavaScript 沒有了阻塞,執(zhí)行完同步代碼后,又讀取事件隊(duì)列里的 DOM 操作,頁面渲染完成。
解決:
使用setTimeout異步執(zhí)行,還有其他辦法例如替換alert等
setTimeout("alert('msg');",?3000);
同學(xué),希望你能看懂^_^
2020-04-04
不是,放在函數(shù)里面的話需要調(diào)用才會(huì)執(zhí)行,得看你alert放在哪里了