setTimeout的那些事
一、我们可以设置一个定时器用以指定某个程序在指定时间后才执行
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的那些事的更多相关文章
- setTimeout,setInterval你不知道的事
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- javascript线程解释(setTimeout,setInterval你不知道的事)---转载
在工作中,可能我们经常遇到在有很多 setInterval 的页面, 再手动触发 setTimeout 的时候经常失败, 尤其是 jquery做动画的时候,一些渐入溅出的东西,很多东西都不被触发……, ...
- javascript线程解释(setTimeout,setInterval你不知道的事)
john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...
- setTimeout,setInterval原理
function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通过堆 ...
- setTimeout(fn, 0)引发的JavaScipt线程的思考
起因 周五改一个checkbox的display属性被错误地设置为none的bug. 经debug发现, 有两个地方修改了display属性: 1) checkbox的controller; 2) c ...
- setTimeout,setInterval你不知道的…
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- setTimeout,setInterval运行原理
function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通 ...
- JavaScript运行机制与setTimeout
前段时间,老板交给了我一个任务:通过setTimeout来延后网站某些复杂资源的请求.正好借此机会,将JavaScript运行机制和setTimeout重新认真思考一遍,并将我对它们的理解整理如下. ...
- Javascript事件机制兼容性解决方案
本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...
- 关于页面刷新或者调用方法事获取不到元素信息或者出现缺少对象错误的换位思考setTimeout的使用
这两天客户的需求不能定下来,做闲人好长时间了,不如来整理下最近碰到的一些个小麻烦. 正题: 场景一. 最近在开发的过程中使用到了百度的富客户端文本编辑器(ueditor)---这是一款功能很强大的文本 ...
随机推荐
- Java课堂学习总结
对于Java字段的初始化来说,共有以下几种方法: 1.类的构造函数(构造方法):当创建一个对象时,其构造函数就会自动调用.构造方法必须与类名相同,无返回值.如果程序员没有定义一个构造函数时,系统会自动 ...
- M1 安装homebrew详解
1.打开终端创建安装目录 sudo mkdir -p /opt/homebrew 2.修改目录权限 sudo chown -R $(whoami) /opt/homebrew 3.进入opt文件夹 c ...
- Linux 系统挂载 ntfs 移动硬盘无法写入的问题
linux 下挂载 ntfs 移动硬盘无法写入问题 在机房使用移动硬盘时发现无法写入硬盘,具体是 Ubuntu 21.04 ,移动硬盘是 SSD ,分区类型是 NTFS . 首先百度得知最优办法是安装 ...
- vector 用法2
vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include< ...
- 【Java】时间类型
Date 转 timeStamp long time = System.currentTimeMillis(); // 秒级 long time = System.currentTimeMillis( ...
- Coursera Programming Languages, Part C 华盛顿大学 Week 1
来进入这一系列课程的最后一 Part 啦! \(P1\) 我们介绍了 \(ML\),一种 static typing 的 functional language \(P2\) 我们介绍了 \(Rack ...
- Windows MFC HTTP POST请求 函数流程
Windows MFC HTTP POST请求 函数流程 1 CString m_strHttpUrl(_T("http://10.200.80.86:8090/course/upload& ...
- B-JUI框架使用探究
附上项目DEMO地址: 点我跳转 下载地址: 点我跳转 先了解一下什么是B-JUI框架: B-JUI(Bootstrap for DWZ)富客户端框架,基于DWZ-jUI富客户端框架修改. 主 ...
- go理论知识总结
基于const常量理解个中类型的内存分配引入参考 官方:Constant expressions may contain only constant operands and are evaluate ...
- [转]NET实现RSA AES DES 字符串 加密解密以及SHA1 MD5加密
表明来源 https://www.cnblogs.com/shanranlei/p/3630944.html#!comments 本文列举了 数据加密算法(Data Encryption Alg ...