今天没事翻了翻JS高程,看到了setTimeout部分有这么一句话:调用setTimeout()之后,该方法会返回一个数值ID,表示超时调用。这个超时调用ID是计划执行代码的唯一标识符,可以通过它来取消超时调用。

然后我从书中上下左右找了半天也没发现有说这个ID的地方,于是乎抱着钻牛角尖的心态我去试了试,发现了一些很有意思的东西。

var id1 =setTimeout(function(){},10);
var id2 =setTimeout(function(){},10);
console.log(id1); //1
console.log(id2); //2
这个不是重点,重点是我又试了一下setInterval():
var id3 =setInterval(function(){},10);
console.log(id3); //3
也就是说这两个函数的id值是顺次创建的,一般情况下我们想要清除一个setTimeout()需要这么做:
clearTimeout(id1);
于是我想既然我们知道了它的id值是不是可以直接去清除呢?我就试了一下:
clearTimeout(1);
OK,成功了,完全没有问题!接着我又想既然他俩的id值都是数字能不能混着清除?然后又试了一下:
clearTimeout(id3);
还是成功了!这俩居然能够混用,我也是醉了。好吧,这个真是神奇,有必要记下来。

接下来再说说这setTImeout()别的方面的一些特点吧。

setTimeout()这个函数的第二个值是一个毫秒数,不能设置成0,或者说设置成0也没啥用,因为H5里面规定了它的最小值是4,也就是说小于4的人家会给你自动加上。

假设可以是0的话下面这个结果也永远是1,3,2:
console.log(1);
setTimeout(function(){console.log(2)},0);
console.log(3);
为什么呢?这就要说到JS语言的特性上了,JS这门语言创作的目的就是为了高效、简单、快捷,所以创作初始就将它定成了一门单线程的语言,但是如果真是单线程的话又会出现很多的问题,比如说事件堵塞,每一个任务执行完了才能去执行下一个任务。打个比方:你朋友中午要来你家吃饭,你决定要给他做几个菜,其中有一道糖醋鱼,会做饭的人都知道做鱼要提前把鱼用调料腌上半天鱼肉才能入味,你早上把鱼腌上了,然后你就在旁边等这个鱼腌好,等了一上午鱼终于腌好了你才发现没有买别的菜,朋友这时候来你家做客你一道菜也没有做好,尴尬了。这就类似于一个单线程的任务,一个执行完了才能执行另一个,其中有大量的等待时间,造成了资源的浪费和任务的堵塞。JS为了解决这个问题引入了异步处理的方法,也就是说你腌了鱼直接扔一边接着去干别的事情,等别的事情弄好了再回来看看鱼腌好没。

Web Work中规定了JS可以拥有多线程,但是同一时间只能拥有一个主线程,除了主线程其他线程不允许任何的dom操作,也就是说其他的线程类似于辅助线程。主线程中有一个执行栈,栈中的任务如果是同步执行结束了就会释放掉,如果是异步则会执行后进入辅助线程的任务队列之中,执行栈中如果空了主线程就会重新查找任务队列中的任务来执行,这叫做任务轮询。而今天我们的主角setTimeout也是一个异步的操作,而且比较不受待见,只有执行栈和任务队列中的任务全部执行完了才会去执行它,也就是说后面这个时间就是一个虚的数字,并不是真正意义上的执行后延时,因此即使它是0,也会是最后执行。

吐槽一句写博客真是挺累的,打了没多久手都酸了,还是敲代码来的省事。最后再说说setTimeout这个函数的另一个用法吧,就是设定计时器:
//计时器
var num = 0;
var max = 10;
function setTime()
{
num++;
console.log(num);
if(num<max){
setTimeout(setTime,1000);
}else{
console.log("Done");
}
}
setTime();
因为setInterval会一直循环如果忘了清除的话有可能会给用户带来不小的困扰,因此做一个计时器来有限次的执行是有很有必要的,当然,setInterval也并不是一无是处,比如常见的轮播图就离不开它,好吧其实setTimeout也能实现它,本来想夸两句的结果又把它黑了。

setTimeout和setInterval不容易注意到的一些细节的更多相关文章

  1. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  2. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

  3. setTimeout和setInterval从入门到精通

    我们在日常web前端开发中,经常需要用到定时器方法. 前端中的定时器方法是浏览器提供的,并不是ECMAScript规范中的.是window对象的方法. 浏览器中的定时器有两种, 一种是每间隔一定时间执 ...

  4. setTimeout和setInterval定时器使用详解测试

    var len=4; while(len--){ var time=setTimeout(function(){ console.log(len); },0); console.log(time); ...

  5. setTimeout,setInterval原理

    function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通过堆 ...

  6. Javascript的setTimeOut()和setInterval()的定时器用法

    Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...

  7. setTimeout和setInterval的注意事项

    精准问题 setTimeout的问题在于它并不是精准的,例如使用setTimeout设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms的cpu时间片,再次轮到定时器执行时,时间已经过 ...

  8. setTimeout和setInterval的区别以及如何写出效率高的倒计时

    1.setTimeout和setInterval都属于js中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval则可以一直 ...

  9. setTimeout()与setInterval()

    一.setTimeout与setInterval的用法(http://www.css88.com/archives/5804) setTimeout是超时调用,javascript是一个单线程的解析器 ...

随机推荐

  1. iOS-联系人应用(一)

    环境:xcode6,iphone 4s simulator with iOS8.0 一.功能界面介绍 1.1 应用启动进入联系人列表页面,数据为模拟数据,来源与一个plist文件: 1.2 点击右上角 ...

  2. 6步就能搞出个react网站哈,玩一把!

    1.安装mk-tools命令行工具   $ npm i -g mk-tools   2.创建空website   $ mk website myDemo $ cd myDemo    3.clone应 ...

  3. Redis-主从配置了解

    集群的作用: 主从备份, 防止主机宕机(相当于从服务器为主服务器担任备份的作用) 读写分离, 分担master的任务 任务分离, 如从服务器分别分担备份工作和计算工作 redis集群方式 星形: 众多 ...

  4. JavaScript关于js垃圾回收

    js中会自动回收那些我们不使用的变量 一般回收算法用的是一个回收器, 这个回收器周期性的遍历程序运行中的所有变量, 并且给这些变量所引用的值做上一个标记, 如果被引用的值是一个对象或是一个数组, 那么 ...

  5. 双向循环链表(C语言描述)(一)

    双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...

  6. Making the Grade (bzoj1592)

    题目描述       FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N ...

  7. NYOJ 57 6174问题

    6174问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替 ...

  8. java中List Array相互转换

    List to Array List 提供了toArray的接口,所以可以直接调用,转为object型数组 List<String> list = new ArrayList<Str ...

  9. mysql数据库密码更改

    先记下,随后继续更改! 方法1: 用SET PASSWORD命令 首先登录MySQL. mysql> set password for 用户名@localhost = password('新密码 ...

  10. html常用的基本标签

    html的基本标签 一.head部分的标签 1.<!DOCTYPE html>文档类型声明,让浏览器按照html标准对代码进行解释与执行:文档类型声明必不可少,而且,必须在文档最上方:如果 ...