javascript使用setTimeout、setInterval时找不到变量的问题

我们在某个作用域内或者在自己定义的一个类里调用setTimeout、setInterval会经常会遇到找不到某个变量的错误。
比如下面这个例子:
 
window.onload = function(){
    manager.init();
};

var manager = {
    init: function() {
        slef = this;
        this.name = "manager";
        setInterval(this.timerMonitor, 1000);
    },
    
    timerMonitor: function(){
        console.log(this.name);
    }
}
我们来看下chrome下的运行结果:
并没有按预想打印manager。因为this.name这个变量是undefined状态。
为什么是这样的结果,因为setInterval是window对象的方法,这是个全局的方法,console.log里的this这个时候指向的应该是window对象,我们可以来调试一下。
 
在console.log这行打上断点:
我们可以看到这个时候的this确实是指向window对象的。
 
 
 
那么怎么解决这个问题呢?使用匿名函数就可以了
只需要把setInterval(timerMonitor, 1000);改为setInterval(function(){self.timerMonitor()}, 1000);就可以了。
完整代码如下:
window.onload = function(){
    manager.init();
};

var manager = {
    init: function() {
        self=this;
        this.name = "manager";
        setInterval(function(){self.timerMonitor()}, 1000);
    },
    
    timerMonitor: function(){
        console.log(this.name);
    }
}

再来看Chrome下的运行结果如下图:

这个时候this.name变量被正确打印出来了。
 
 
 
 

转载于:https://www.cnblogs.com/yikezhuixun/p/6081189.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值