js 详解setTimeout定时器

setTimeout: 定时器函数

第一个参数是匿名函数,第二个参数是延迟执行时间

setTimeout(function(){},time)

注意:

1.setTimeout函数是Window对象提供的方法,因此this默认指向window,可以通过bind/call/apply改变this指向

2.setTimeout函数的真正执行时间是在所有可执行的代码执行完毕后才会执行(函数调用栈清空后)

3.多个setTimeout函数存在的情况下,会按照延迟执行时间的先后执行

    setTimeout(function(){console.log('a:'+a)},10);   //5
    var a=10;
    console.log('b:'+b);     //1
    console.log('fn:'+fn);   //2
    var b=20;
    function fn(){
        setTimeout(function(){console.log('setTimeout 0s')},0)
    }
    fn.toString=function(){return 30}
    console.log('fn2:'+fn)   //3
    fn();                    //4

 结合上面注意的点,可知道执行顺序为以上标识,具体解释如下:

 1:执行打印b,因为变量的声明会提前,同时赋默认值为undefined,但执行的时候b还没有赋值

     所以b是undefined

 2: 执行打印fn,因为fn的声明也会提前,因为函数声明会同时把函数体也带着(函数表达式就不一定了)

     所以fn是setTimeout(function(){console.log('setTimeout 0s')},0)

 3: 执行再次打印fn,因为这个时候fn加了一个tostring方法,因此会默认走toString方法

    所以此时fn是30

 4: 执行fn(),因为延迟时间小于第一个setTimeout

    所以此时fn的值为setTimeout 0s

 5: 执行打印a,打印为10

原文地址:https://www.cnblogs.com/artimis/p/9013825.html