2017-03-02 7 views
0

以下のコードでは、基本的に30秒から0にカウントダウンする単純なタイマースクリプトを実行しています。ステージ。CreateJSは毎秒動的なテキストボックスを更新しませんHTML 5キャンバスアニメーション

this.stop(); 

//COUNTDOWN TIMER 
var minute = 0; 
var second = 30; 

var clock = setInterval(function() { 
    second = second -1; 
    if(minute == 0 && second == 0){ 
     clearInterval(clock) 
    } 


     //If the seconds are less than 10, add a 0 
     if(second < 10){ 
     console.log("0"+minute+":0"+second+""); 
     }else{ 
     //Normal 
     console.log("0"+minute+":"+second+""); 

     } 

     this.text = second; 
     this.myTimer1.myTimer2.text = second 


}, 1000); 

しかし、カウントダウンが正常に機能している間、私は常にmyTimer2が定義されていないというエラーメッセージが表示されます。私は本当にこれについての答えを見つけるのに苦労しています。 myTimer1はムービークリップのインスタンス名 myTimer2はムービークリップ内のダイナミックテキストボックスのインスタンス名です

助けてください。

おかげ

+0

'myTimer1'で定義された' myTimer2'子(と変数)がありますか?あなたはlib jsを投稿できますか?インターバル内には「これ」とは何ですか?関数がグローバルスコープで呼び出される可能性は非常に高いので、 'this'は' Window'です。 – Lanny

答えて

0

あなたは、このエラーが表示される場合:Cannot read property 'myTimer2' of undefinedが、これは単にスコープの問題です。

関数を引数としてsetIntervalに渡すと、グローバルスコープで呼び出されます。同じスコープ(秒、分など)で定義された変数は引き続き使用できますが、thisはグローバルになります。

は、関数スコープを解決するには、いくつかの方法があります。


共通(かつ簡単)回避策は、単にローカルスコープにthisにエイリアスを定義することです。関数は引き続きグローバルスコープで呼び出されますが、参照するスコープへの参照があります。通常は、_thisまたはthat変数でコード例が表示されます。

var _this = this; 
setTimeout(function() { 
    _this.doSomething(); // 
}, duration); 

別のアプローチは、メソッドをバインドすることです。これは古いブラウザではサポートされていませんが(それには多量のpolyfillがあります)、CreateJSを使用している場合、古いブラウザのサポートは本当に問題になりません。

setTimeout(function() { 
    this.doSomething(); 
}.bind(this), duration); 

希望します。詳細については、plenty of articles on scope in JavaScriptがあります。

関連する問題