javaScript定时器

定时器有两种:

  • 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();
 

 

posted on 2019-08-22 22:08  黑大叔呀  阅读(124)  评论(0编辑  收藏  举报

导航