回调函数之定时器

定时器基础

setTimeout

第一个参数是一个函数,对于第二个参数,因为js是单线程的,所以一段时间内只能执行一段代码,所以就有了任务队列,这些任务会按照它们添加的顺序执行,而第二个参数指的就是多长时间后把函数添加到任务队列中。如果队列是空的,添加的代码就会立即执行,如果有其他的任务,就会等任务全部执行后再执行。
调用setTimeout后会返回一个id,返回的数字可以是任意值,再次调用就会返回一个不同的数字。可以用来取消setTimeout。

var timeOutId=setTimeout(function(){
    alert('hello world!')
},30)
clearTimeout(timeOutId);

setTimeout的代码都是在全局作用域中执行的,因此函数中的this的值指向window对象。

将setTimeout的时间设置为0,为什么执行顺序仍未是先执行呢?

不能将setTimeout理解为某段时间后执行某段函数。事实上setTimeout真正做的事情是在某段时间后将某个回调函数插入到事件队列中。这个操作并不是js来做,而是由事件触发线程做的,至于单线程执行的js,会在执行完同步的任务后去执行队列中的异步任务。
setTimeout即是将同步任务变成了异步任务,所以即使设置延迟参数为0,这未能代表回调函数就能立即执行,js依然会将全部同步代码执行完之后才去执行回调函数。在这里。同步任务可以简单理解为非异步的立即执行的函数。很明显,循环操作甚至是死循环也是同步任务。

setInterval

只要不取消就会一直执行下去。ID和参数和取消的方式和上面的一样,只是用的比较少。

 var a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);//输出结果为1、3、2原因是setTimeout是异步函数,会等其他的执行完之后再执行。
var flag = true;
setTimeout(function(){
    flag = false;
},0)
while(flag){}
console.log(flag);//这段代码什么都输不出,因为setTimeout是异步函数,会让后面的先执行,while(flag){}执行的时候,已经是死循环了,所以console.log(flag)什么也输不出。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInt...
    许先生__阅读 3,762评论 0 1
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,744评论 0 21
  • JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInt...
    晚晴幽草阅读 5,601评论 1 18
  • 瞬间染黑平地波 密密匝匝生天灾 劲风扑面掀狂涛 生灵涂炭今日来 火速救援四方动 应急机制显能耐 呜呼苍龙别任性 无...
    千秋笔阅读 3,550评论 0 1
  • 直到25岁她都恨透了他的爸爸。 8岁以前的记忆都是爸爸打妈妈,爸爸打牌不干活。 小学三年级,老师问“宏丽...
    山崖葵阅读 1,792评论 0 0

友情链接更多精彩内容