17

さて、このプロトタイプ オブジェクト Stage があり、この再帰呼び出しを除いて、そのすべての部分が機能します。

Stage.prototype.start = function(key) {
        //var maxScrollLeft = document.getElementById("content").scrollWidth;
        $content.scrollLeft($content.scrollLeft() + this.initspeed);
        if(key < this.maxScrollLeft || key > 0) {
                setTimeout(function() {
                        this.start(key+2);
                },1); 
        }else{
                console.log("stop");
        }   
}   

this.start(); を使用して、この if ステートメント内で Stage.prototype.start が呼び出されるようにしようとしています。ただし、呼び出しが匿名関数にあることに関係しているといつも Uncaught TypeError: Object [object global] has no method 'start' 思いますが、これを修正する方法についてのアイデアはありますか?

4

1 に答える 1

24

this関数はどこにもバインドされていないため、 setTimeout の匿名コールバックの内部はグローバル オブジェクトを指し、グローバル スコープに引き上げられます。この場合、関数はそのコンテキストから呼び出されるため、コールバックはwindow(ブラウザ) またはglobal(ノードなど) コンテキストから実行されthis、グローバル スコープを指します。この問題にアプローチするには多くの方法があります。簡単な方法の 1 つは、変数にキャッシュthisし、それをコールバック関数で使用することです。

 Stage.prototype.start = function(key) {
           var self = this; //cache this here
            //var maxScrollLeft = document.getElementById("content").scrollWidth;
            $content.scrollLeft($content.scrollLeft() + this.initspeed);
            if(key < this.maxScrollLeft || key > 0) {
                    setTimeout(function() {
                            self.start(key+2); //use it to make the call
                    },1); 
            }else{
                    console.log("stop");
            }   
    }   

フィドル

もう 1 つの方法は、function.prototype.bindを使用してコンテキストをバインドすることです。

 Stage.prototype.start = function(key) {
            //var maxScrollLeft = document.getElementById("content").scrollWidth;
            $content.scrollLeft($content.scrollLeft() + this.initspeed);
            if(key < this.maxScrollLeft || key > 0) {
                    setTimeout((function() {
                            this.start(key+2); //now you get this as your object of type stage
                    }).bind(this),1);  //bind this here
            }else{
                    console.log("stop");
            }   
    }   

フィドル

于 2013-09-25T01:25:16.277 に答える