javascript对象范围和设置超时有问题吗?
我有一些代码遵循以下结构:javascript对象范围和设置超时有问题吗?,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,我有一些代码遵循以下结构: function = roulette(){ _this = this; this.spin = spin; this.timeoutFunction = timeoutFunction; this.object1 = { x : 0 } function spin(){ if (typeof this.shuffleTimer !== 'undefined') {
function = roulette(){
_this = this;
this.spin = spin;
this.timeoutFunction = timeoutFunction;
this.object1 = {
x : 0
}
function spin(){
if (typeof this.shuffleTimer !== 'undefined') {
clearTimeout(_this.shuffleStart);
}
this.shuffleStart = setTimeout(_this.timeoutFunction(), _this.object1.x);
}
function timeoutFunction(){
this.object1.x += 5;
//do some DOM manipulation here
console.log(_this.object.x);
if(this.object1.x < 5000){
this.shuffleStart = setTimeout(_this.timeoutFunction(), _this.object1.x);
}
}
}
function=roulette(){
_这个=这个;
这个旋转=旋转;
this.timeoutFunction=timeoutFunction;
此参数为0.1={
x:0
}
函数自旋(){
if(typeof this.shuffleTimer!=“未定义”){
clearTimeout(_this.shuffleStart);
}
this.shuffleStart=setTimeout(_this.timeoutFunction(),_this.object1.x);
}
函数timeoutFunction(){
this.object1.x+=5;
//在这里做一些DOM操作
log(_this.object.x);
if(this.object1.x<5000){
this.shuffleStart=setTimeout(_this.timeoutFunction(),_this.object1.x);
}
}
}
它肯定没有按预期工作-虽然
console.log
记录的this.object1.x
正在增加,但它的速度太快,速度太快,如果timeoutFunction
中的setTimeout
在每次调用它的时间增加后被设置为关闭,那么它就不会工作了 setTimeout希望有一个内联函数作为其回调函数。更改此项:
this.shuffleStart = setTimeout(_this.timeoutFunction(), _this.object1.x);
为此:
var ctx = this;
this.shuffleStart = setTimeout(function(){ctx.timeoutFunction()}, _this.object1.x);
稍微重新考虑一下代码,使其与
this
vs\u this
内部函数的使用保持一致。从传递到setTimeout
的函数中删除了()
一切似乎都如你所愿
function Roulette() {
var _this = this;
this.object1 = {
x: 0
};
this.spin = function spin() {
if (undefined !== this.shuffleTimer) clearTimeout(this.shuffleStart);
this.shuffleStart = setTimeout(this.timeoutFunction, this.object1.x);
};
this.timeoutFunction = function timeoutFunction() {
_this.object1.x += 5;
console.log(_this.object1.x);
if(_this.object1.x < 5000){
_this.shuffleStart = setTimeout(timeoutFunction, _this.object1.x);
}
};
}
var r = new Roulette();
r.spin();
函数轮盘赌(){
var_this=这个;
此参数为0.1={
x:0
};
this.spin=函数spin(){
如果(未定义!==this.shuffleTimer)clearTimeout(this.shuffleStart);
this.shuffleStart=setTimeout(this.timeoutFunction,this.object1.x);
};
this.timeoutFunction=函数timeoutFunction(){
_this.object1.x+=5;
log(_this.object1.x);
如果(_this.object1.x<5000){
_this.shuffleStart=setTimeout(timeoutFunction,_this.object1.x);
}
};
}
var r=新轮盘赌();
r、 自旋();
这里有几个问题。其中之一是object1
与\u this.object1
不同。那么我如何在设置超时内引用object1呢?看起来object1
和\u此
是全局设置的,而不是在此
上(轮盘的实例
),也不是作为新轮盘的变量设置的。对不起,这是我的错误,按照最初的代码object1会被设置为轮盘赌的一个实例,我已经相应地编辑了OP。好吧,你现在修复了它。但是\u this=this
应该仍然是var\u this=this
,如@PaulS。指出。不幸的是,不是这样,结果是一样的。@styke你在调用setTimeout
的两个地方都做了更改吗?@styke你是如何调用整个过程的?另外,是否打开浏览器控制台以检查错误?一个自调用函数将创建一个轮盘对象的新实例,然后在mouseclick上调用spin函数。@styke onclick处理程序引入了另一个问题。。。我建议您编辑这个问题,并添加一个复制所有这些方面的JSFIDLE示例;它被用作事件处理程序。当我执行newRoulete=newRoulete()时,事件处理程序只调用newRoulete.spin()。谢谢,这个答案很好用!