定时器有两种:
- setTimeout(只执行一次)
setTimeout(function(){},1000);
- setInterval(每隔一段时间重复执行)
setInterval(function(){},1000);
清除定时器:
- clearTimeout() ``` var i = 0; var timer = setInterval(function(){ //console.log('***'+timer); i++; if(i == 5){ -clearInterval(1); //清除定时器传入参数是代表定时器的那个数字
-clearInterval(timer); //一般设置定时器时用变量接收一下,清除时传入变量名 } console.log(i); },1000); ``` - clearInterval() - 这两个方法技术上都可以清除两种定时器,但是为了区分,应该对应起来用
定时器的异步:
定时器是js中的一种异步机制,永远会在同步代码执行后运行
setTimeout(function(){ console.log(111); },0) console.log(222); //先输出222,再输出111
有关定时器的题目:
运行结果是什么?
for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); }, 0); }
代码会输出 5 5 5 5 5,当i = 0时,生成一个定时器,将回调插入到事件队列中,等待当前队列中无任务执行时立即执行,而此时for循环正在执行,所以回调被搁置。
当for循环执行完成后,队列中存在着5个回调函数,他们的都将执行console.log(i)的操作,因为当前JS代码上中并没有使用块级作用域,所以i的值在for循环结束后一直为5,
所以代码将输出5个5
var obj = { msg: 'obj', shout: function () { alert(this.msg); }, waitAndShout: function() { setTimeout(function () { this.shout(); }, 0); } }; obj.waitAndShout();
这道题涉及到定时器中的this指向window或全局对象,window中不存在shout方法,所以运行代码会报错
修改方案如下:
var obj = {
msg: 'obj',
shout: function () {
alert(this.msg);
},
waitAndShout: function() {
var self = this; // 这里将this赋给一个变量
setTimeout(function () {
self.shout();
}, 0);
}
};
obj.waitAndShout();