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

我们在某个作用域内或者在自己定义的一个类里调用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(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变量被正确打印出来了。

问题解决了,问题也来了,为什么这么改就好了呢?后面再更新blog说明原因。

时间: 2024-10-26 01:03:00

javascript使用setTimeout、setInterval时找不到变量的问题(1)的相关文章

javascript线程解释(setTimeout,setInterval你不知道的事)

原文:http://www.iamued.com/qianduan/1645.html 今天看到这篇文章,学到了不少东西 特此发出来 和大家分享 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert('你好!'); } , 0); setInterval( callbackFunction , 100); 认为se

javascript中的setInterval()和setTimeout()用法比较

setTimeout()和setInterval() 何时被调用执行 定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除. 从定义上我们可以看到两个函数十分类似,只不过前者执行一次,而后者可以执行多次,两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒

javascript的setTimeout以及setInterval休眠问题。

前端码农们在做项目中时候,必定不可少的需要做到轮播效果.但是有些特殊的需求,比如: 需要做到第一个容器内容轮播滚动之后,第二个容器内部再轮播滚动,再第三个容器内容轮播滚动. 这时候我的一开始的思路是:每个容器都看成一个单独的轮播效果,既然是依次的滚动就设定滚动开始时间差,三个setTimeout()分别延迟差. HTML 代码: <div id="warp">        <div class="items">            <

javascript中setTimeout和setinterval的区别是?

setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束.如果运行的代码中再次运行同样的setTimeout命令,则可循环运行. setinterval是循环运行的,即每到设定时间间隔就触发指定代码.这是真正的定时器. serinterval使用简单,而setTimeout则比较灵活,可以随时推出循环,而且可以设置为按不固定的时间间隔来运行,比如第一次1秒,第二次2秒,第三次3秒...... setTimeout  定义和用法:  setTimeout()方法用于

js异步处理工作机制(setTimeout, setInterval)

经常谈到异步,但是发现自己一直没深入理解setTimeout, setInterval,逛论坛的时候发现了这篇好文章,分享一下. ————————————————————以下为原文————————————————————————————— 从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下下面三个函数是如何控制计时器的. var id = setTimeout(fn, de

JavaScript 的setTimeout 和Angular中的$timeout的區別

JavaScript中setTimeout返回值类型和意义说明: 1.setTimeout :暂停指定的毫秒数后执行指定的代码,返回值是id标识,这个id的意义就是通过clearTimeout来清理暂停执行函数. setTimeout函数的ID标识(number类型),每次调用setTimeout函数都会产生一个唯一的ID,可以通过clearTimeout函数(此函数的参数接收一个setTimeout返回的ID)暂停setTimeout函数还未执行的代码 <html> <head>

定时器相关 setTimeout setInterval

这个问题也是在参加百度的前端技术学院中遇到的 任务中需要用js实现动画  导师给的评价中setInterval会导致bug 当时不理解   下面把自己学习的过程分享出来 再次理解单线程   老是说js是单线程的,其实自己根本没有好好的理解好这个单线程的意思,就比如我对这个setTimeout(function(){},time)的理解就是在从现在开始到time时间点就会执行的一段代码,其实这样的理解是有问题的,定时器只是计划代码在未来的某个时间执行,但是这个时机是无法保证的 ,这句话能更好的帮助

解决eclipse配置Tomcat时找不到server选项(Mac通用)

集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境(Runtime Environments) ——添加(Add),添加Tomcat服务器.对应安装的Tomcat版本选择Apache Tomcat v6.0.下一步通过“浏览(Brower)”按钮选择之前Tomcat的安装目录,指定后点击“完成”完成配置. 问题在于我的Eclipse为新版本eclip

解决eclipse配置Tomcat时找不到server选项

集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)--首选项(preferences)--服务器(Server)--运行时环境(Runtime Environments) --添加(Add),添加Tomcat服务器.对应安装的Tomcat版本选择Apache Tomcat v6.0.下一步通过"浏览(Brower)"按钮选择之前Tomcat的安装目录,指定后点击"完成"完成配置. 问题在于我的E