国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

#關(guān)于setTimeout的妙用

崔曉明 / 1019人閱讀

摘要:如果對(duì)當(dāng)前元素的點(diǎn)擊事件處理加上的話,那么執(zhí)行順序就會(huì)改變?yōu)楦冈禺?dāng)前元素。這樣的結(jié)果會(huì)導(dǎo)致新內(nèi)容很晚才能渲染完成,很多時(shí)候我們需要讓界面先渲染完成之后在去調(diào)用引擎來(lái)執(zhí)行,那么可以使用來(lái)延遲引擎的調(diào)用

關(guān)于setTimeout的妙用 定義

在指定的延遲時(shí)間之后調(diào)用一個(gè)函數(shù)或執(zhí)行一個(gè)代碼片段

這個(gè)是setTimeout最主要的功能,但也是很坑的地方,首先javascript其實(shí)是運(yùn)行在單線程的環(huán)境下,意味者定時(shí)器會(huì)在未來(lái)的某個(gè)時(shí)間支持,但是具體的執(zhí)行的時(shí)間并不能夠很準(zhǔn)確的運(yùn)行,容易受到其它時(shí)間的影響,比如DOM的計(jì)算、事件的執(zhí)行、各種函數(shù)的執(zhí)行和運(yùn)算。但是我們可以利用延遲執(zhí)行的一些特性來(lái)達(dá)到我們想要的功能。

    window.setTimeout(callbask, delay, [param1, param2, ...])
函數(shù)節(jié)流

程序運(yùn)行過(guò)程中對(duì)某個(gè)函數(shù)調(diào)用次數(shù)很多導(dǎo)致界面不斷回流或者重排,這時(shí)候就需要對(duì)這個(gè)函數(shù)進(jìn)行節(jié)流,比如監(jiān)聽(tīng)touchmove、scroll事件等,可以限定函數(shù)在單位時(shí)間內(nèi)只執(zhí)行一次

    var throttle = function(method, context) {
        clearTimeout(method.tId);
        method.tId = setTimeout(function(){
            method.call(context);
        },100);
    }
控制執(zhí)行

點(diǎn)擊事件是會(huì)產(chǎn)生冒泡,執(zhí)行的順序是當(dāng)前點(diǎn)擊元素->父元素->...->document,一直往上執(zhí)行到document。如果對(duì)當(dāng)前元素的點(diǎn)擊事件處理加上setTimeout的話,那么執(zhí)行順序就會(huì)改變?yōu)楦冈?>...->document->當(dāng)前元素。這樣就可以控制冒泡事件的執(zhí)行順序

    var parent = document.getElementById("parent");
    var child = document.getElementById("child");

    document.body.addEventListener("click", function(e) {
        console.log("body");

    }, false);

    parent.addEventListener("click", function(e) {
        console.log("parent");
    }, false);
    
    child.addEventListener("click", function(e) {
        setTimeout(function() {
            console.log("child");
    
        }, 0);
    }, false);
    
    /*
    *parent
    *body
    *child
    */
構(gòu)建一個(gè)輪詢(xún)?nèi)蝿?wù)

javacsript中已經(jīng)有一個(gè)開(kāi)啟輪詢(xún)的方法,就是setInterval,但是這種存在一個(gè)問(wèn)題就是執(zhí)行間隔往往就不是你希望的間隔時(shí)間

比如有個(gè)輪詢(xún)?nèi)蝿?wù)間隔是100ms,但是執(zhí)行方法的時(shí)間需要450ms,那么在200ms、300ms、400ms本來(lái)是計(jì)劃中執(zhí)行任務(wù)的時(shí)間,瀏覽器發(fā)現(xiàn)第一個(gè)還未執(zhí)行完,那么就會(huì)放棄2、3、4次的任務(wù)執(zhí)行,并且在500ms之后再次執(zhí)行任務(wù),這樣的話,其實(shí)再次執(zhí)行的間隔就只有50ms。使用setTimeout構(gòu)造輪詢(xún)能保證每次輪詢(xún)的間隔

    setTimeout(function(){
        alert(1);
        setTimeout(arguments.callee, 100);
    },100)
分塊處理耗時(shí)計(jì)算

瀏覽器給javascript的運(yùn)行規(guī)定了內(nèi)存和時(shí)間,假如javascript運(yùn)行的時(shí)間超過(guò)了規(guī)定時(shí)間,那么瀏覽器就會(huì)""報(bào)錯(cuò)""

    for(var i = 0; i < arr.length; i++){
        //耗時(shí)很久的嵌套循環(huán)或者運(yùn)算
        doSomeing(arr[i]);
    }

假如在循環(huán)中做的處理的邏輯不是同步的話,那么可以把邏輯""分片""執(zhí)行

    sertTimeout(function(){
        var item = arr.shift();
        dosomeing(item);
        if(arr.length <0 ){
            setTimeout(arguments.callee, 100);
        }
    }, 100);
延遲JS引擎的調(diào)用

GUI渲染線程和JS引擎的執(zhí)行之間是互斥,當(dāng)JS引擎執(zhí)行時(shí)GUI線程會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎執(zhí)行完畢時(shí)立即被執(zhí)行。這樣的結(jié)果會(huì)導(dǎo)致新內(nèi)容很晚才能渲染完成,很多時(shí)候我們需要讓界面先渲染完成之后在去調(diào)用JS引擎來(lái)執(zhí)行,那么可以使用setTimeout來(lái)延遲JS引擎的調(diào)用

    var div = document.createElement("div");
    div.setAttribute("style", "background-color:#233; width:100px; height:100px");
    document.body.appendChild(div);
    
    setTimeout(function() {
        alert(1);
    }, 100);

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80854.html

相關(guān)文章

  • 解析setTimeout時(shí)間設(shè)置為0

    摘要:要是當(dāng)前代碼耗時(shí)很長(zhǎng),有可能要等很久,所以并沒(méi)有辦法保證,回調(diào)函數(shù)一定會(huì)在指定的時(shí)間執(zhí)行。需要監(jiān)聽(tīng)文字改變,每一次改變都會(huì)調(diào)用一次回調(diào)函數(shù),現(xiàn)在需要的一種實(shí)現(xiàn)是在用戶(hù)停止鍵盤(pán)事件一段時(shí)間后,去發(fā)送一個(gè)請(qǐng)求。 1、開(kāi)胃菜,setTimeout為何物 首先看一下w3school上面對(duì)于setTimeout的解釋 setTimeout(fn,millisec) 方法用于在指定的毫秒數(shù)后調(diào)用函...

    zhigoo 評(píng)論0 收藏0
  • ::before和::after偽元素妙用

    摘要:下面是偽元素和偽元素的具體用法和使用規(guī)則作用在標(biāo)簽前后添加字符串使用規(guī)則后面一定要用把要添加的內(nèi)容括起來(lái),否則是無(wú)法顯示的括號(hào)不一定需要添加。場(chǎng)景: 假如有一天,你的在寫(xiě)一個(gè)前端項(xiàng)目,是關(guān)于一份點(diǎn)餐商家電話信息表,你啪塔啪塔地寫(xiě)完了,突然間項(xiàng)目經(jīng)理跑過(guò)來(lái)找你,要求你在每一個(gè)商家的電話號(hào)碼前都添加一個(gè)電話符號(hào),來(lái)使得電話號(hào)碼更直觀和頁(yè)面更美觀。這個(gè)時(shí)候你就糾結(jié)了,這不是折磨人嗎?這不是要我在...

    番茄西紅柿 評(píng)論0 收藏0
  • javascript-從toString方法在判斷復(fù)雜數(shù)據(jù)類(lèi)型上妙用,引申到對(duì)原型鏈理解

    摘要:所以,當(dāng)我們使用時(shí),不能進(jìn)行復(fù)雜數(shù)據(jù)類(lèi)型的判斷,因?yàn)樗{(diào)用的是,雖然也繼承自,但在上重寫(xiě)了,而我們通過(guò)實(shí)際上是通過(guò)原型鏈調(diào)用了。 關(guān)于 toString 方法在有關(guān)js的開(kāi)發(fā)中使用應(yīng)該是相當(dāng)廣泛的,這兩天在看jQuery的源碼,從 toString 本身了解與鞏固了不少知識(shí),寫(xiě)出來(lái)與大家一同分享。首先先上一段代碼: var arr=[1,2,3]; toString.call(arr)...

    sean 評(píng)論0 收藏0
  • js中this四種使用場(chǎng)景

    摘要:最近讀到了一篇介紹中的四種使用場(chǎng)景的文章,感覺(jué)總結(jié)的很好,所以我認(rèn)真讀了讀,并且動(dòng)手實(shí)踐了其中的,與大家共享。 最近讀到了一篇介紹js中this的四種使用場(chǎng)景的文章,感覺(jué)總結(jié)的很好,所以我認(rèn)真讀了讀,并且動(dòng)手實(shí)踐了其中的demo,與大家共享。原文鏈接:https://github.com/alsotang/n...遇到this,一直要記得這句:函數(shù)執(zhí)行時(shí),this總是指向調(diào)用該函數(shù)的對(duì)...

    lk20150415 評(píng)論0 收藏0
  • React 應(yīng)用設(shè)計(jì)之道 - curry 化妙用

    摘要:右側(cè)展現(xiàn)對(duì)應(yīng)產(chǎn)品。我們使用命名為的對(duì)象表示過(guò)濾條件信息,如下此數(shù)據(jù)需要在組件中進(jìn)行維護(hù)。因?yàn)榻M件的子組件和都將依賴(lài)這項(xiàng)數(shù)據(jù)狀態(tài)。化應(yīng)用再回到之前的場(chǎng)景,我們?cè)O(shè)計(jì)化函數(shù),進(jìn)一步可以簡(jiǎn)化為對(duì)于的偏應(yīng)用即上面提到的相信大家已經(jīng)理解了這么做的好處。 showImg(https://segmentfault.com/img/remote/1460000014458612?w=1240&h=663...

    sewerganger 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<