定时器有两种:
- 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();