定时器基础
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)什么也输不出。
网友评论