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地獄。

  • 相关阅读:
    docker 安装ELK
    关于centOS安装配置mysql5.6那点事
    关于centOS安装配置xampp那点事
    PowerDesigner16.5连接Oracle数据库生成E-R图
    Microsoft Visual Studio 中工具箱不显示DevExpress控件的解决办法
    Linux 基础命令
    oracle数据库表空间创建&导入&导出
    weblogic10.3.6漏洞修改方案
    oracle数据库表空间追加数据库文件方法
    转移博客
  • 原文地址:https://www.cnblogs.com/wupeng88/p/9995327.html
Copyright © 2011-2022 走看看