楼主怒了!setTimeout调用类成员函数,气死人啊! Javascript对象中关于setTimeout和setInterval的this介绍是setTimeout里面作用域的问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 function start(){ var test = new ClassA(); test.run();}你把对象做成局部变量怎么行? 就是这样调用的啊,有什么不妥么。<input type="button" value="开始" onClick="start()"> 谢谢,但是前两种方法看不懂 能讲讲么?// 法1setTimeout(this.fn.bind(this), 1000); //这个也是直接用this啊// 法2setTimeout((function(a,b){ return function(){ b.call(a); } })(this,this.fn), 1000); //这个更乱了,call是所有对象都有的方法么? 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是一样的,所以等价于第二种情况。 感谢楼上几位的启发! 自己总结一下备忘。关键点是被setTimeout循环调用的函数体(包括setTimeout的参数)中不能有this字样。 因为凡是被setTimeout调用的函数,代码中的this都不是我们所期望的那个了!我尝试把上面例子函数中的所有this都改成全局变量,这样运行正常。function ClassA(){ this.i = 0;}var ii=0ClassA.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坑人啊) 再补充一点。因为写成类的形式就是要封装自己的数据,不想在成员函数里写各种全局变量。所以我还是要用到this. 这就需要用function(){} 包一层了。为什么呢?我的理解是,window会直接调用setTimeout第一个参数(函数指针)的“函数体”。setTimeout(obj.run,1000);setTimeout(this.run,1000); 这两种是一样的,相当于 window直接执行run()里面的语句。只有包一层才能保留真正调用run的对象。fsetTimeout(function(){this.run();},1000); //相当于window去执行 this.run(); setTimeout(function(){obj.run();},1000); // 相当于window去执行obj.run(); 只有这个能确保run()里this是obj 关于JS 斜线移动问题!高手进! 求:Object 对像 要求有一个name属行值=value 选择题 请问如何在日期上加一个月 Extjs的Tab中grid的自动宽度问题 [菜鸟自学三]图片切换(滤镜IE Only) 动态弹出层 如何将对象变量传递给定时器函数setInterval 对象参数问题 求助:js问题 select 的问题. jquery label和radio 要阻止冒泡该怎么实现,return false不行 请教....
var test = new ClassA();
test.run();
}
你把对象做成局部变量怎么行?
<input type="button" value="开始" onClick="start()">
setTimeout(this.fn.bind(this), 1000); //这个也是直接用this啊
// 法2
setTimeout((function(a,b){
return function(){
b.call(a);
}
})(this,this.fn), 1000); //这个更乱了,call是所有对象都有的方法么?
test = new ClassA();
test.run();
}
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是一样的,所以等价于第二种情况。
关键点是被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坑人啊)
这就需要用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