1

自分自身を呼び出し、カウンターによって壊れている setTimeout 関数を使用しようとしています。ただし、NaNエラーが発生し続けます。誰かが私を助けることができますか?

<script language="javascript">
    function Tests() {
        this.i = 0;
    }


    Tests.prototype.increment_test = function () {
        if (this.i > 2) {
            return;
        }
        alert(this.i);
        this.i++;

        setTimeout(this.increment_test, 30);
    }

    ta = new Tests();
    ta.increment_test();
</script>
4

4 に答える 4

3

this関数に永続的にバインドされていませんincrement_test

変数で参照thisし、無名関数内で使用できます。

var self = this;
setTimeout(function() { self.increment_test()}, 30);

Function.prototype.bindまたは、呼び出しコンテキストを関数にバインドするために使用できます。

setTimeout(this.increment_test.bind(this), 30);

または、コンテキストをバインドする小さなユーティリティを作成できます。

function _bindCtx(fn, ctx) {
    return function() { return fn.apply(ctx); };
}

そしてそれをこのように呼びます。

setTimeout(_bindCtx(this.increment_test, this), 30);
于 2012-09-12T14:27:01.293 に答える
1

関数をsetTimeout呼び出すと、そのコンテキストが に変更されwindowます。だから、内部はあなたが思っているものincrement_testではありません。this

次のようにする必要があります。

var self = this;
setTimeout(function(){
    self.increment_test();
}, 30);
于 2012-09-12T14:26:43.577 に答える
0
function Tests() {
    this.i = 0;
    // Next line added. I think what it's the best solution because it can 
    // increase the speed and reduce the consumption of resources (memory) 
    // when used with setTimeout()
    this.increment_test = this.increment_test.bind(this);
}


Tests.prototype.increment_test = function () {
    if (this.i > 2) {
        return;
    }
    alert(this.i);
    this.i++;

    setTimeout(this.increment_test, 30);
}

ta = new Tests();
ta.increment_test();
于 2012-09-12T14:43:43.750 に答える
0

setInterval から関数を実行する場合、「this」変数のコンテキストはオブジェクトではなく「window」オブジェクトです。次の方法でコンテキストを渡す必要があります。

setTimeout(this.increment_test.apply(this), 30)
于 2012-09-12T14:28:19.313 に答える