1. 程式人生 > >setTimeout(call,0)作用

setTimeout(call,0)作用

可能 不可 on() 評論 element child htm 期望 能夠

setTimeout(call,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實現,否則不好實現)。
先看個例子:

1技術分享圖片<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2技術分享圖片<html>
3技術分享圖片<head>
4技術分享圖片<title>setTimeout</title>
5技術分享圖片<script type="text/javascript" >
6技術分享圖片
(function(){
7技術分享圖片
8技術分享圖片 function get(id){
9技術分享圖片 return document.getElementById(id);
10技術分享圖片 }
11技術分享圖片
12技術分享圖片 window.onload = function(){
13技術分享圖片 get(‘makeinput‘).onmousedown = function(){
14技術分享圖片 var input = document.createElement(‘input‘);
15技術分享圖片 input.setAttribute(‘type‘, ‘text‘);
16技術分享圖片 input.setAttribute(‘value‘, ‘test1‘);
17技術分享圖片
get(‘inpwrapper‘).appendChild(input);
18技術分享圖片 input.focus();
19技術分享圖片 input.select();
20技術分享圖片 }
21技術分享圖片 get(‘makeinput2‘).onmousedown = function(){
22技術分享圖片 var input = document.createElement(‘input‘);
23技術分享圖片 input.setAttribute(‘type‘, ‘text‘);
24技術分享圖片 input.setAttribute(‘value‘, ‘test1‘);
25技術分享圖片 get(‘inpwrapper2‘).appendChild(input);
26技術分享圖片 setTimeout(function(){
27技術分享圖片 input.focus();
28技術分享圖片 input.select();
29技術分享圖片 }, 0);
30技術分享圖片 }
31技術分享圖片 get(‘input1‘).onkeypress = function(){
32技術分享圖片 get(‘preview1‘).innerHTML = this.value;
33技術分享圖片 }
34技術分享圖片 get(‘input2‘).onkeypress = function(){
35技術分享圖片 setTimeout(function(){
36技術分享圖片 get(‘preview2‘).innerHTML = get(‘input2‘).value;
37技術分享圖片 },0 );
38技術分享圖片 }
39技術分享圖片 }
40技術分享圖片 })();
41技術分享圖片</script>
42技術分享圖片</head>
43技術分享圖片<body>
44技術分享圖片 <h1><code>DEMO1</code></h1>
45技術分享圖片 <h2>1、未使用 <code>setTimeout</code>(未選中文本框內容)</h2>
46技術分享圖片 <button id="makeinput">生成 input</button>
47技術分享圖片 <p id="inpwrapper"></p>
48技術分享圖片 <h2>2、使用 <code>setTimeout</code>(立即選中文本框內容)</h2>
49技術分享圖片 <button id="makeinput2">生成 input</button></h2>
50技術分享圖片 <p id="inpwrapper2"></p>
51技術分享圖片
52技術分享圖片--------------------------------------------------------------------------
53技術分享圖片 <h1><code>DEMO2</code></h1>
54技術分享圖片 <h2>1、未使用 <code>setTimeout</code>(只有輸入第二個字符時,前一個字符才顯示出來)</h2>
55技術分享圖片 <input type="text" id="input1" value=""/><div id="preview1"></div>
56技術分享圖片 <h2>2、使用 <code>setTimeout</code>(輸入時,字符同時顯示出來)</h2>
57技術分享圖片<input type="text" id="input2" value=""/><div id="preview2"></div>
58技術分享圖片</body>
59技術分享圖片</html>
60技術分享圖片
61技術分享圖片

運行示例
現有的 JavaScript 引擎是單線程處理任務的。它把任務放到隊列中,不會同步去執行,必須在完成一個任務後才開始另外一個任務。其實,這是一個把需要執行的任務從隊列中跳脫的技巧。在DEMO1中,JavaScript 引擎在執行 onmousedown時,由於沒有多線程的同步執行,不可能同時去處理剛創建元素的 focus 和 select 方法,由於這兩個方法都不在隊列中,在完成 onmousedown 後,JavaScript 引擎已經丟棄了這兩個任務,正如第一種情況。而在第二種情況中,由於setTimeout可以把任務從某個隊列中跳脫成為新隊列,因而能夠得到期望的結果。

setTimeout(call,0)作用