setTimeout的妙用

定義和用法

setTimeout() 方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。

基本用法

下面的代碼將在"大約"2s后輸出s;為什么是大約呢?因?yàn)椴⒉荒鼙WC準(zhǔn)確的2s后執(zhí)行,因?yàn)閖s是單線程,setTimeout只是在2s后插入任務(wù)隊(duì)列。

//兩個(gè)參數(shù) 1.要執(zhí)行的函數(shù)表達(dá)式 2.延遲時(shí)長(單位毫秒)
setTimeout("console.log('s')",2000);

第一個(gè)參數(shù)為函數(shù)

例如下面

function a(s){
console.log(s);
}
setTimeout("a('dd')",1000);
//dd

注意:如果參數(shù)不是全局變量要傳遞參數(shù)時(shí)

function a(s){
console.log(s);
}
function b(){
var c="ss";
}
setTimeout(function(){a(c);},1000);

任務(wù)隊(duì)列

以下代碼會怎么執(zhí)行呢?

setTimeout("console.log('s')",0);
for(var i=0;i<100;i++){
console.log(i);
}

答案是先輸出0-99,然后輸出s。這就是為什么setTimeout不能保證按時(shí)執(zhí)行的原因,因?yàn)槠渌a執(zhí)行“優(yōu)先級”更高。

其他用法

一.

以下一段簡單的代碼,在線演示地址http://jsrun.net/7piKp/edit
html

<input type="" name="" onkeydown="set(event)">
<p id="show"></p>

script

function set(e) {
        var show = document.querySelector("#show");
        show.innerText = e.target.value;
}

結(jié)果

同步

我們發(fā)現(xiàn)結(jié)果總是慢半拍,這時(shí)因?yàn)楫?dāng)我們按下按鈕時(shí)input里面的value值還沒來得及改變我們就獲取他,導(dǎo)致值的獲取慢一步。
所以我們可以稍微“延后”一下值的獲取。在線地址http://jsrun.net/cpiKp/edit

function set(e) {
        var show = document.querySelector("#show");
        setTimeout(show.innerText = e.target.value, 0);
}

結(jié)果就和我們想的一樣了。當(dāng)然直接把onkeydown換成onkeyup就不需要使用setTimeout了。
二.
這次是在動畫中使用,當(dāng)我們做元素進(jìn)入動畫的時(shí)候
html

<div class="s"></div>
<button onclick="set()">添加動畫</button>

css

.s {
        width: 200px;
        height: 200px;
        background: red;
    }

js

function set() {
        var ele = document.querySelector(".s");
        ele.style.transition = "none";
        ele.style.transform = "translateX(200px)";
        ele.style.transition = "all 1s ease-in";
        ele.style.transform = "translateX(0)";
}

我們點(diǎn)擊按鈕后先后為div添加了兩個(gè)transform,我們期望的效果是div從200緩慢移動到0,但結(jié)果就是這兩個(gè)transform相互抵消了,這也是瀏覽器渲染優(yōu)化的一部分。
但是我就是想做這種動畫怎么辦?當(dāng)然可以,仿照上面,既然瀏覽器會把兩個(gè)transform抵消那我們就稍微“延后”一下,在線演示地址http://jsrun.net/FpiKp/edit

    function set() {
        var ele = document.querySelector(".s");
        ele.style.transition = "none";
        ele.style.transform = "translateX(200px)";
        //ele.offsetWidth;
        setTimeout(function() {
            ele.style.transition = "all 1s ease-in";
            ele.style.transform = "translateX(0)";
        }, 0);
    }

當(dāng)然不使用setTimeout也是可以的,使用ele.offsetWidth或者ele.offsetHeight來觸發(fā)重繪也是可以的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容