ねえ、私はここにこのコードを持っています:http: //pastie.org/534470
また、109行目で、「TypeError:式の結果'this.allVarsDefined'[undefined]は関数ではありません」というエラーが表示されます。
javascriptのスコープは私を混乱させます。誰かが私の問題が何であるかを見ることができますか?また、JavaScriptのスコープについて学ぶのに役立つ記事を知っていますか。JSを実際に使用するのはこれが初めてです:)
ねえ、私はここにこのコードを持っています:http: //pastie.org/534470
また、109行目で、「TypeError:式の結果'this.allVarsDefined'[undefined]は関数ではありません」というエラーが表示されます。
javascriptのスコープは私を混乱させます。誰かが私の問題が何であるかを見ることができますか?また、JavaScriptのスコープについて学ぶのに役立つ記事を知っていますか。JSを実際に使用するのはこれが初めてです:)
これはプロトタイプベースのようです。おそらく、通知コールバックを次のように設定する必要があります。
setTimeout(this.notify.bind(this), 5000, track);
これにより、通知関数が Scrobbler オブジェクトにバインドされthis
、タイムアウトが発生したときに関数をトリガーするイベントではなく、Scrobbler オブジェクトに設定されます。
プロトタイプを使用して間違っている場合は、おそらく次を使用して同じ効果を得ることができます
var that = this;
setTimeout( function() { that.notify(); }, 5000, track );
から109行目を変更してみてください
setTimeout(this.notify, 5000, track);
に
setTimeout(function(){this.notify()}, 5000, track);
これが行うことは、「this」変数を含む「クロージャ」(function(){this.notify()}) を作成することであり、「this」には this.allVarsDefined が含まれるため、そのエラーが発生するのを停止する必要があります。
古いコードの問題は、「this.notify」を記述するときに、オブジェクトのインスタンスから関数をヤンクして setTimeout に渡すだけで、オブジェクト自体に関する情報を渡していないことだと思います。通知関数が「this」を参照していなければ問題ありませんが、「this」を参照しているため、クロージャを使用する必要があります。
Javascript のクロージャーについて詳しく読むと、より効果的です。ここにまともな記事があります。また、O'Reilly著のすばらしい本Java Script: The Definitive Guide 5th Editionもお勧めします。50 ドルほどしかかかりませんが、よく書かれており、JavaScript で Web アプリケーションを作成しようとしている場合に非常に役立ちます。
私の解決策が機能しない場合は、コードを単純化して、機能するはずで機能しないと思われる最も基本的なものにしてから、ここに投稿してください。