setTimeout详解
生活随笔
收集整理的這篇文章主要介紹了
setTimeout详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.cnblogs.com/wzndkj/p/7069331.html
一、setTimeout基礎
setTimeout(func|code,delay); 第一個參數表示將要推遲的函數名或者一段代碼,第二個參數表示推遲執行的毫秒數 eg: console.log(1); setTimeout('console.log(2)',1000); console.log(3);answer: 1 3 2 *:推遲的代碼必須以字符串的形式,因為引擎內部使用eval()函數,將字符串轉為代碼。 *:如果推遲執行的是函數,則可以直接將函數名,放入setTimeout() eg: function func(){console.log(2); } setTimeout(func,5000); //或者 setTimeout(function(){console.log(2); },1000)?
*:如果寫成setTimeout(func(),5000);func會立即執行
?
二、setTimeout支持更多的參數 eg: setTimeout(function(a,b){console.log(a+b); },1000,4,5)//4,5 9 //'str' '2' str2 *:從第三個參數開始,依次用來表示第一個參數(回調函數)傳入的參數 *:一些古老的瀏覽器是不支持,可以用bind或apply方法來解決 eg: setTimeout(function(a,b){console.log(a+b); }.bind(this,4,5),1000) *:第一個參數表示將原函數的this綁定全局作用域,第二個參數開始是要傳入原函數的參數 *:當調用綁定函數時,綁定函數會以創建它時傳入bind()方法的第一個參數作為 this 三、setTimeout()中回調函數中的this eg: var a=1; var obj={a:2,b:function(){setTimeout(function(){console.log(this.a);},2000);} }; obj.b(); 上面代碼輸出的是1,而不是2,表示o.b的this所指向的已經不是o,而是全局環境了 可以用bind()來改變這個情況: var a=1; var obj={a:2,b:function(){setTimeout(function(){console.log(this.a);}.bind(this),2000);//注意這行} }; obj.b();?
四、setTimeout()執行回調間隔時間長度 var startTime = new Date(); setTimeout(function () {console.log(new Date() - startTime); }, 100); //100+ 取決于后面同步執行的JS需要占用多少時間 五、setTimeout(func,0) eg:func1和func2誰會先執行?function func1(){console.log(1); } function func2(){console.log(2); } setTimeout(function () {func1(); }, 0) func2();?
setTimeout(function(){func1() },0) setTimeout(function(){func1(); })有什么差別?
0秒延遲,此回調將會放到一個能立即執行的時段進行觸發。javascript代碼大體上是自頂向下的,但中間穿插著有關DOM渲染,事件回應等異步代碼,他們將組成一個隊列,零秒延遲將會實現插隊操作。 不寫第二個參數,瀏覽器自動配置時間,在IE,FireFox中,第一次配可能給個很大的數字,100ms上下,往后會縮小到最小時間間隔,Safari,chrome,opera則多為10ms上下。 六、setTimeout和單線程 首先需要注意javascript是單線程的,特點就是容易出現阻塞。如果一段程序處理時間很長,很容易導致整個頁面hold住。什么交互都處理不了怎么辦?setTimeout一個很關鍵的用法就是分片,如果一段程序過大,我們可以拆分成若干細小的塊。 例如上面的情況,我們將那一段復雜的邏輯拆分處理,分片塞入隊列。這樣即使在復雜程序沒有處理完時, 我們操作頁面,也是能得到即使響應的。其實就是將交互插入到了復雜程序中執行。
換一種思路,上面就是利用setTimeout實現一種偽多線程的概念
有個函數庫Concurrent.Thread.js 就是實現js的多線程的 eg:Concurrent.Thread.create(function(){for(var i=0; i<100000000; i++){console.log(i);} })$('#test').click(function(){alert(1); }); 雖然有個巨大的循環,但是這時不妨礙你去觸發alert(); 當我們需要渲染一個很復雜的DOM時,例如table組件,復雜的構圖等等, 假如整個過程需要3s,我們是等待完全處理完成在呈現,還是使用一個setTimeout分片, 將內容一片一片的斷續呈現。 其實setTimeout給了我們很多優化交互的空間。 七、如何使用 setTimeout這么厲害,那么我們是需要在在項目中大量使用嗎? 我這邊的觀點是非常不建議,在我們業務中,基本上是禁止在業務邏輯中使用setTimeout的
例如,當一個實例還沒有初始化的前,我們就使用這個實例,錯誤的解決辦法是使用實例時加個setTimeout,確保實例先初始化。 為什么錯誤?這里其實就是使用hack的手段 第一是埋下了坑,打亂模塊的生命周期 第二是出現問題時,setTimeout其實是很難調試的。
綜上,setTimeout其實想用好還是很困難的,時間的不確定性,排隊運算混亂, 他更多的出現是在框架和類庫中,例如一些實現Promis的框架,就用上了setTimeout去實現異步。
轉載于:https://www.cnblogs.com/beimingbingpo/p/8532023.html
總結
以上是生活随笔為你收集整理的setTimeout详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统的远程登录
- 下一篇: Support for the expe