js中的setTimeout遇到的困惑

来源:互联网 发布:js td赋值 编辑:程序博客网 时间:2024/05/23 11:06

1.定义 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

  注意事项: 1、如果 setTimeout()中的要执行的方法,可以加引号或不加引号。如果 setTimeout()中的要执行的代码,则必须加引号!!!

                   2、.setTimeout()中的this指向的是window,而不是调用者。

2.                     

function mytest() { 
   for(var i = 0; i < 5; i ++) 
      setTimeout(console.log(i),0); 

function mytest() { 
   for(var i = 0; i < 5; i ++) 
      setTimeout(function(){console.log(i)},0); 
}

测试发现,两者打印出来的值并不是一样的,可以自行测试。经查看资料发现,原因主要在于js是单线程的。查阅资料说明如下:

如有一个函数fun0在执行开始时创建了一个定时器T1,T1定时器将在200ms后被触发指定函数。这时我们需要考虑一个问题,假设fun0的执行时间为250ms(大于200ms),那将会怎样?前面已经说过,js是单线程的,所以不存在fun0和定时器同时执行的情况。这时候定时器制定的函数会在fun0执行完后才执行,定时器的等待时间为250ms,并不是我们指定的200ms。

对于javascript这样的执行方式,我们可以想象在函数执行过程中有两个队列。队列Q1是指执行队列,每次只能执行一个函数;队列Q2就是等待队列,存放着将要执行的函数。每当有一个函数要执行时,就会先把这个函数放进等待队列,如果Q1为空,那么久立即执行这个函数。当然在大多数情况下,函数都是立即执行的。

所以第二个函数中的settimeout要等for循环完成之后,再执行,所以打印出来都是5.

1 0