setTimeout计时器

  首先来看这样一个问题:

例1:   
var messages = ['1', '2', '3']; for (var i = 0; i < messages.length; i ++) { setTimeout(function(){ console.log(message[i]); }, i * 1500); }

  console.log()的结果是3个undefined,而不是想要的“1‘’,2‘’,‘’3”这样的结果。为什么会导致这样的结果,首先我们需要弄清楚setTimeout这个计时器的原理。

  语法: setTimeout(code,millisec)

  code指的是要调用的函数后要执行的 JavaScript 代码串,通常为一个函数;

  millisec指的是在执行代码前需等待的毫秒数。

  举个例子:

例2
setTimeout("alert('3秒后会有弹窗出现')", 3000 )

  页面会等三秒才弹出alert框。也就是说setTimeout中alert(第一个参数)执行前要等待3秒(第二个参数设置的时间)。

  再看一个例子:

    function fn(){
        setTimeout(function(){alert(“第一个”)},0);
	alert(“第二个”);
    }
    fn();

  先执行alert(“第二个”),后执行alert(“第一个”)。

  现在回头来看例1,setTimeout()函数需要在for循环完之后再执行,for循环执行完之后i=3,messages[3]没有定义,所以会出现结果undefined。

  为什么是3次undefined?这就要求深追JavaScript运行机制了,楼主比较白,不太懂,就不多做介绍了。直白来说就是for循环一次,setTimeout()就需要执行一次,因为不是立即执行(你把时间参数(第二个参数)设置为0也不行),所以会等for循环完三次之后,setTimeout()才会执行三次。上面提到了i的值为3,messages[3]没有定义,这也就解释了为什么会出现三个undefined的原因了。

  对于如何解决这个问题,达到想要的结果,只需要有一个小小的改动,把for中的var改为let

  

  至于var和let的区别,可以找找相关的资料进行查阅。

  

 

  

  

  

  

  

 

posted @ 2017-06-23 00:11  飞奔吧小土豆  阅读(390)  评论(0编辑  收藏  举报