zoukankan      html  css  js  c++  java
  • js中setTimeout() 时间参数为0

    当看到下面 这种setTimeout 设置为0 写法的时候一脸懵逼,完全没用过。

    var fuc = [1,2,3];
    for(var i in fuc){
      setTimeout(function(){console.log(fuc[i])},0);
      console.log(fuc[i]);
    }
    

      

    问:控制台会如何打印?

    chrome打印结果如下:

     

    setTimeout(0)的意思

    SetTimeout為在一個指定的延迟时间后执行某個函數,所以如果帶入(0),則是否意味馬上執行的意思?來看下面程式碼。

    setTimeout(function(){
       console.log("Hello");
    },0)
    console.log("Mark");
    
    執行結果為:
    Mark
    Hello
    

    嚴來來說不是立即執行,而是立即排进Task Quenu等待执行,等Call Stack空时它会至Task Quenu寻找工作,因此执行結果才为Mark Hello

    如果不知道Task QuenuCall Stack可至該篇看Event Driven的觀念。

    http://marklin-blog.logdown.com/posts/294474-javascript-event-driven

    setTimeout非同步的范例

    首先看看下面的程式碼,doSomething函数需要等到取得到data才执行,但getData会执行很久,但下面的doSomething1与2不需要data就可以执行,所以這時这种写法就會很浪費時間。

    var data = getData();
    doSomething(data);
    
    doSomething1();
    doSomething2();
    

    所以我們將getDatafucntion修改為如下。

    function getData(callBack){         
        setTimeout(function(){
            //getData要執行的程式碼
    
            callBack();
        },10);
    }
    

    然後我們整段程式碼就可以改成。

    getData(doSomething);
    doSomething1();
    doSomething2();
    

    上面這種寫法,我們把同步操作转变成非同步操作,getData不會阻塞住整个线程,以上就是其種一種的非同步的寫法,但這種寫法有個缺點就是很容易變成CallBack地獄。

  • 相关阅读:
    SSL延迟有多大?(转)
    Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)
    lvs、haproxy、nginx 负载均衡的比较分析(转)
    入木三分学网络第一篇--VRRP协议详解第一篇(转)
    从一个开发的角度看负载均衡和LVS(转)
    四层和七层负载均衡的区别(转)
    geo实现方案
    HTTP API 设计指南(转)
    app后端设计(0)--总目录(转)
    Django接收自定义http header(转)
  • 原文地址:https://www.cnblogs.com/wupeng88/p/9995327.html
Copyright © 2011-2022 走看看