setTimeout延时0毫秒的作用
經常看到setTimeout延時0ms的javascript代碼,感到很迷惑,難道延時0ms和不延時不是一個道理嗎?后來通過查資料以及實驗得出以下兩個作用
1、實現javascript的異步;
正常情況下javascript都是按照順序執行的。但是我們可能讓該語句后面的語句執行完再執行本身,這時就可以用到setTimeout延時0ms來實現了。
如:?
alert(1);?
setTimeout("alert(2)", 0);?
alert(3);?
雖然延時了0ms,但是執行順序為:1,3,2?
這樣就保證setTimeout里面的語句在某一代碼段中最后執行。?
2、在事件中,setTimeout 會在其完成當前任何延宕事件的事件處理器的執行,以及完成文檔當前狀態更新后,告訴瀏覽器去啟用 setTimeout 內注冊的函數。;
?舉個例子來說這句話的意思,假如當某個事件在頁面上建立一個文本框,并給文本框賦值(完成文檔當前狀態更新),然后將焦點定到文本框,并且選中文本框的內容(后面部分就需要用到setTimeout 延遲0ms實現,否則不好實現)。
先看個例子:
<h1><code>DEMO2</code></h1> <h2>1、未使用 <code>setTimeout</code>(只有輸入第二個字符時,前一個字符才顯示出來)</h2> <input type="text" id="input1" value=""/><div id="preview1"></div> <h2>2、使用 <code>setTimeout</code>(輸入時,字符同時顯示出來)</h2> <input type="text" id="input2" value=""/><div id="preview2"></div> </body> </html>
現有的 JavaScript 引擎是單線程處理任務的。它把任務放到隊列中,不會同步去執行,必須在完成一個任務后才開始另外一個任務。其實,這是一個把需要執行的任務從隊列中跳脫的技巧。在DEMO1中,JavaScript 引擎在執行?onmousedown時,由于沒有多線程的同步執行,不可能同時去處理剛創建元素的 focus 和 select 方法,由于這兩個方法都不在隊列中,在完成?onmousedown?后,JavaScript 引擎已經丟棄了這兩個任務,正如第一種情況。而在第二種情況中,由于setTimeout可以把任務從某個隊列中跳脫成為新隊列,因而能夠得到期望的結果。
轉載于:https://www.cnblogs.com/likers/p/3937599.html
總結
以上是生活随笔為你收集整理的setTimeout延时0毫秒的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell脚本获取客户端IP
- 下一篇: [转]F# Samples 101 -