JavaScript的计时器

        从JavaScript问世开始,浏览器就定义了两个函数:steTimeout()和setInterval()。利用这两个函数,程序可以让浏览器在指定的时间过后调用一个函数,或者每经过一定时间就重复调用一次某个函数。这两个函数至今没有被写进核心语言标准,但所有浏览器和Node都支持,属于JavaScript标准库的事实标准。

        setTimeout()的第一个参数是函数,第二个参数是数值,数值表示过多少毫秒之后调用第一个函数。在经过指定时间后(如果系统忙可能会稍微晚一点),将会调用作为第一个参数的函数,没有参数。例如,下面是3个setTimeout()调用,分别在1秒、2秒和3秒之后打开一条控制台信息:

       setTimeout(()=>{ console.log("Ready...");},1000);

   setTimeout(()=>{ console.log("set...");},2000);

   setTimeout(()=>{ console.log("go!");},3000);

        注意,setTimeout()并不会等到指定时间之后再返回。前面这3行代码都会立即运行并返回,只是在未到1000毫秒时什么也不会发生。

       如果省略传给setTimeout()的第二个参数,则该参数默认值为0.但这并不意味着你的函数会立即被调用,只意味着这个函数会被注册到某个地方,将被“尽可能快地”调用。如果浏览器由于处理用户输入或其他事件而没有空闲,那么调用这个函数的时机可能在10毫秒甚至更长时间以后。

       setTimeout()注册的函数只会被调用一次。有时候,这个函数本身会再次调用setTimeout(),以便在将来某个时刻会再有一次调用。不过,要想重复调用某个函数,通常更简单的方式是使用setInterval()。setInterval()接收的参数与setTimeout()相同,但会导致 每隔指定时间(同样是个近似的毫秒值)就调用一次指定函数。

       setTimeout()和setInterval()都返回一个值。如果把这个值保存再变量中,之后可以把它传给clearTimeout()或clearInterval()以取消对函数的调用。在浏览器中,这个返回值通常是一个数值,而在Node中则是一个对象。具体什么类型其实不重要,只要把它当成一个不透明的值就行了。这个值的唯一作用就是可以把它传给clearTimeout()以取消使用setTimeout()注册的函数调用(假设函数尚未被调用),或者传给clearInterval()以取消对通过setInterval()注册的函数的重复调用。

       下面这个例子演示了使用setTimeout()、setInterval()和claerInterval(),以及控制台API显示简单的数字时钟:

      // 每隔1秒:清空控制台并打印当前时间

    let clock = setInterval(()=>{

      console.clear();

      console.log(new Date().toLocaleDateString());

    },1000);

    // 10秒后:停止重复上面的代码

    setTimeout(()=>{ clearInterval(clock);},10000);

       在第13章介绍异步编程时,我们还会看到setTimeout()和setInterval()。

标签: JavaScript 计时器