日期:2014-05-16  浏览次数:20425 次

楼主怒了!setTimeout调用类成员函数,气死人啊!
折腾了一个下午。就是想把一堆比较乱的code封到一个类里。其中有个成员函数需要用setTimeout 每隔1秒调用一次。
但是写了几次都不行。 请问为什么

function ClassA(){
   this.i = 0;
}
ClassA.prototype.run = function(){
   this.i++;
   document.getElementById('txt').value=this.i;
   var obj = this;
  setTimeout(function(){obj.run();},1000);           //只有这样写能成功!请问为什么以下几种不行啊?
//setTimeout(obj.run,1000);                                  //这样第二次调用的i值就变成了NaN
//setTimeout(function(){this.run();},1000);          //Object [object global] has no method 'run'
//setTimeout(this.run,1000);                                 //直接this更不行了
}
// 入口函数,调用 ClassA.run()
function start(){
  var test = new ClassA();
  test.run();
}

如上所示,请问为什么一定要用obj 代替this,并且用function包起来啊? 感觉完全不懂JS 。。。
------解决方案--------------------
Javascript对象中关于setTimeout和setInterval的this介绍
是setTimeout里面作用域的问题
------解决方案--------------------
function start(){
  var test = new ClassA();
  test.run();
}
你把对象做成局部变量怎么行?
------解决方案--------------------
function start(){
  test = new ClassA();
  test.run();
}
------解决方案--------------------
这this 可厉害,习惯习惯,
------解决方案--------------------
[code=javascript]
  setTimeout(function(){obj.run();},1000);           //只有这样写能成功!请问为什么以下几种不行啊?
//setTimeout(obj.run,1000);                                  //这样第二次调用的i值就变成了NaN
//setTimeout(function(){this.run();},1000);          //Object [object global] has no method 'run'
//setTimeout(this.run,1000);                                 //直接this更不行了
[/code

首先要知道:setTimeout(func,time)和setInterval(func,time)中,参数func为函数  且该函数中的this只会指向window。
然后我们再看一下上面四种方式:
第一种成功 应该没啥疑问。
第二种,函数参数为obj.run 即:
 function(){
     this.i++;
     document.getElementById('txt').value=this.i;
     var obj .......
     .......
}
因为this是指向window的,window.i又不存在,所以会出错。

第三种也是,因为this指向window,而全局对象中并没有run这个方法,所以会报错。
第四种中的this.run和obj.run是一样的,所以等价于第二种情况。
------解决方案--------------------
引用:
[code=javascript]
  setTimeout(function(){obj.run();},1000);         &nb