Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript对象范围和设置超时有问题吗?_Javascript_Jquery_Settimeout - Fatal编程技术网

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()。谢谢,这个答案很好用!