解决方案 »

  1.   

    function start(){
      var test = new ClassA();
      test.run();
    }
    你把对象做成局部变量怎么行?
      

  2.   

    就是这样调用的啊,有什么不妥么。
    <input type="button" value="开始" onClick="start()">
      

  3.   

    谢谢,但是前两种方法看不懂 能讲讲么?// 法1
    setTimeout(this.fn.bind(this), 1000);   //这个也是直接用this啊
    // 法2
    setTimeout((function(a,b){  
        return function(){  
            b.call(a);  
        }  
    })(this,this.fn), 1000);                      //这个更乱了,call是所有对象都有的方法么?
      

  4.   

    function start(){
      test = new ClassA();
      test.run();
    }
      

  5.   

    这this 可厉害,习惯习惯,
      

  6.   

    [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是一样的,所以等价于第二种情况。
      

  7.   

    感谢楼上几位的启发! 自己总结一下备忘。
    关键点是被setTimeout循环调用的函数体(包括setTimeout的参数)中不能有this字样。 因为凡是被setTimeout调用的函数,代码中的this都不是我们所期望的那个了!
    我尝试把上面例子函数中的所有this都改成全局变量,这样运行正常。function ClassA(){
       this.i = 0;
    }
    var ii=0
    ClassA.prototype.run = function(){
       ii++;
       document.getElementById('txt').value=ii;
       setTimeout(test.run,1000);                  //是全局变量test,不是this
    }
    var test = new ClassA();
    function start(){
      test.run();
    }但是如果红的那里用 this.run(), 则只能打印出1,2。  说明第一次执行到setTimeout时this是正确的,第二次setTimeout调用run,里面再设置setTimeout时,这个this就不对了!!(JS坑人啊)
      

  8.   

    再补充一点。因为写成类的形式就是要封装自己的数据,不想在成员函数里写各种全局变量。所以我还是要用到this. 
    这就需要用function(){} 包一层了。为什么呢?
    我的理解是,window会直接调用setTimeout第一个参数(函数指针)的“函数体”。setTimeout(obj.run,1000);
    setTimeout(this.run,1000);    这两种是一样的,相当于 window直接执行run()里面的语句。
    只有包一层才能保留真正调用run的对象。
    f
    setTimeout(function(){this.run();},1000);    //相当于window去执行 this.run(); 
    setTimeout(function(){obj.run();},1000);  // 相当于window去执行obj.run();  只有这个能确保run()里this是obj