一、我们可以设置一个定时器用以指定某个程序在指定时间后才执行

1 setTimeout(function(){
2 console.log("do something");
3 },1000)

用setTimeout,指定1秒后执行

二、当然也可以在想要清除定时器的时候,想办法清除它

只需要给setTimeout起一个别名,clearTimeout这个别名即可

1 // 给定时器起个别名st1
2 var st1 = setTimeout(function(){
3 console.log("do something");
4 },1000)
5
6
7 // 清除定时器st1
8 clearTimeout(st1)

别名st1的值为该setTimeout的返回值,该返回值是timeoutID ,是一个正整数,从数字1开始命名,多个定时器其它返回值是从1开始依次编号,即1 2 3 4,表示定时器的编号,这个值可以传递给clearTimeout()来取消该定时器

三、如果你想在指定这个定时器时传递一些参数也是可以的

值得一提的是setTimeout可以传多个参数

setTimeout(function(){}, 时间,参数1,参数2,参数3 ...)

 1 var p1 = '参数1', p2 = '参数2', p3 = '参数3';
2
3 var st1 = setTimeout(function(p1, p2, p3){
4 console.log("do something 传递的参数:", p1, p2, p3);
5 },1000, p1, p2, p3)
6
7 // 或者
8 var st1 = setTimeout(function(a, b, c){
9 console.log("do something 传递的参数:", a, b, c);
10 },1000, '参数1', '参数2', '参数3')

四、定义多个定时器,且将其赋值给

 1     var st1 = setTimeout(function(i){
2 console.log(i);
3 },1000,11)
4
5 var st2 = setTimeout(function(i){
6 console.log(i);
7 clearTimeout(st3);
8 },2000,22)
9
10 var st3 = setTimeout(function(i){
11 console.log(i);
12 },3000,33)

执行结果是:

11

22

因为在第7行,清除了定时器st3,因此st3不存在了

五、将setTimeout放在循环中会怎么样

 1 function fn(){
2 for(var i=0; i<3; i++){
3 var st1 = setTimeout(function(i){
4 console.log('x', i);
5 clearTimeout(st1);
6 },1,i)
7 console.log('y', i);
8 }
9 }
10 fn();

执行结果是:

y 0

y 1

y 2

x 0

x 1

分析

这里用到了Event Loop即事件循环知识,

一段代码,首先要区分是“同步任务”还是“异步任务”,“同步任务”总是早于“异步任务”先顺序执行,

for循环内,只有两大块代码,

分别是:

属于“同步任务”的var定义(但var定义等号右边setTimeout是个“异步任务”)

属于“同步任务”的 console.log('y', i);

具体执行是这样的:

i=0时,遇到var定义,执行var 赋值操作,将st1值赋值为定义setTimeout时的返回值 即 1,但考虑到setTimeout是“异步任务”且细说属于“宏任务”,遂将其添加到“任务队列”的“宏任务”子队列中

这时我们看变量st1的值是第一个setTimeout时定义返回值即这个定时器编号数字1

遇到console.log('y', i); 输出 y 0

i=1时,遇到var定义,执行var 赋值操作,将st1值赋值为定义setTimeout时的返回值 即 2,但考虑到setTimeout是“异步任务”且细说属于“宏任务”,遂将其添加到“任务队列”的“宏任务”子队列中

这时我们看变量st1的值是第二个setTimeout时定义返回值即这个定时器编号数字2

遇到console.log('y', i); 输出 y 1

i=2时,遇到var定义,执行var 赋值操作,将st1值赋值为定义setTimeout时的返回值 即 3,但考虑到setTimeout是“异步任务”且细说属于“宏任务”,遂将其添加到“任务队列”的“宏任务”子队列中

这时我们看变量st1的值是第三个setTimeout时定义返回值即这个定时器编号数字3

遇到console.log('y', i); 输出 y 2

“执行栈”中,“同步任务”代码执行完了,这时就去从“任务队列”中去按“先入先执行”的原则顺序,依次载入“执行栈”,挨个执行,值得一提的是从“任务队列”中调用任务总是先看是否有“微任务”,如果有,则,从“微任务”中,依次载入“执行栈”执行,“微任务”为空,则从“宏任务”调入执行

这里,

1.首先将“编号1的setTimeout”载入“执行栈”执行,输出 x 0 ,其中 clearTimeout(st1),由于此时 st1为“第三个setTimeout时定义返回值即这个定时器编号数字3”,所以,将执行清除“编号3的定时器”动作

2.将“编号2的setTimeout”载入执行栈执行,输出 x 1,再次 clearTimeout(st1) 清除“编号3的定时器”动作

3.由于“宏任务”中“编号3的setTimeout”被清除,因此,“宏任务”被全部执行完毕,程序也到此为止

setTimeout的那些事的更多相关文章

  1. setTimeout,setInterval你不知道的事

    javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...

  2. javascript线程解释(setTimeout,setInterval你不知道的事)---转载

    在工作中,可能我们经常遇到在有很多 setInterval 的页面, 再手动触发 setTimeout 的时候经常失败, 尤其是 jquery做动画的时候,一些渐入溅出的东西,很多东西都不被触发……, ...

  3. javascript线程解释(setTimeout,setInterval你不知道的事)

    john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...

  4. setTimeout,setInterval原理

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

  5. setTimeout(fn, 0)引发的JavaScipt线程的思考

    起因 周五改一个checkbox的display属性被错误地设置为none的bug. 经debug发现, 有两个地方修改了display属性: 1) checkbox的controller; 2) c ...

  6. setTimeout,setInterval你不知道的…

    javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...

  7. setTimeout,setInterval运行原理

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

  8. JavaScript运行机制与setTimeout

    前段时间,老板交给了我一个任务:通过setTimeout来延后网站某些复杂资源的请求.正好借此机会,将JavaScript运行机制和setTimeout重新认真思考一遍,并将我对它们的理解整理如下. ...

  9. Javascript事件机制兼容性解决方案

    本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...

  10. 关于页面刷新或者调用方法事获取不到元素信息或者出现缺少对象错误的换位思考setTimeout的使用

    这两天客户的需求不能定下来,做闲人好长时间了,不如来整理下最近碰到的一些个小麻烦. 正题: 场景一. 最近在开发的过程中使用到了百度的富客户端文本编辑器(ueditor)---这是一款功能很强大的文本 ...

随机推荐

  1. P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)

    个人思路: 首先,题目可以转化为是否存在 \(a,b\) 路径上一点 \(u\),满足 \(w_u = dis{1,a} \oplus dis{1,b} \oplus w_{lca(a,b)} \op ...

  2. iOS开发 网络学习(4)HTTPS

    一.HTTPS简介 HTTPS : Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单讲是HTTP的安全版. ...

  3. laravel qq第三方登录

    QQ互联官网 首先申请成为开发者获取到后面需要的 client_id redirect_uri client_secret 文档资料/SDK及资源下载/SDK下载/PHP SDK 下载下来修改文件修改 ...

  4. Qt中QGraphicsScene和QraphicsView显示坐标问题解决

    相信打开这个界面的你,一定遇到了这两玩意儿设置完坐标发现对不上的问题...查询Qt官方文档后发现: 网上搜索了一番,基本上这个坐标系就是长酱紫: 所以加上这行代码就行了: ui->graphic ...

  5. mysql 1130报错只允许localhost登录解决方法

    提示:这些方法会改变登录权限,如果是生产服务器端谨慎操作!!! mysql出现错误码1130的解决办法: 错误描述: 错误代码:1130Host ***.***.***.*** is not allo ...

  6. fail-fast简介

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308762.html fail-fast简介(使用concurrentHashMap可以完美避免这个问题 ...

  7. STM32 获取系统时钟频率

    //定义一个RCC_ClocksTypeDef 的结构体 RCC_ClocksTypeDef get_rcc_clock; //调用RCC_GetClocksFreq获取系统时钟状态 RCC_GetC ...

  8. springsecurity 配置swagger

    最近在学习springsecurity 安全框架,具体是什么概念在这里不一一赘述了.下面呢,咱们一起搭建一下简单的springsecurity swagger 项目感受一下. 首先初始化spring ...

  9. 记录一个二级域名绑定动态ip的操作

    家里的路由器,还有一台路由器需要登录,以前一直用f3322的动态域名绑定,感觉使用也还可以,但最近几个月,只要是f3322.com的二级域名全部被chrome标注为危险. 所以准备换一个免费的二级域名 ...

  10. Java实验 继承与接口

     一.实验目的 1.理解 Java 语言的继承和多态特性: 2.掌握变量的隐藏.方法的覆盖.重载: 3.掌握抽象类和接口的使用. 二.实验要求 1.根据实验步骤中提出的要求,使用eclipse等开发工 ...