2017-12-28 27 views
0

私のクラス内にあるという変数を 'としましょう'と比較する必要があります。比較は、 'utcChange'と呼ばれる別の機能で実行する必要があります(ボタンをクリックした後)。私は、この変数を最初に宣言すれば、どこにでもアクセスできるようになると思っていました。なぜ内部のステートメントutcChange機能が動作していないのですか?は、グローバル変数としてもクラス内の変数の値を比較できません

let hours; 

class Clock { 
    el: Element; 
    constructor(element) { 
    this.el = element; 
    setInterval(() => this.run(), 1000) 
    } 

    run() { 
    var time = new Date(); 
    let hours = time.getHours()+utcValue; 
    var hoursChanged = hours.toString(); 
    var minutes = time.getMinutes().toString(); 
    var seconds = time.getSeconds().toString(); 

    if (hoursChanged.length < 2) { 
     hoursChanged = '0' + hoursChanged; 
    } 

    if (minutes.length < 2) { 
     minutes = '0' + minutes; 
    } 

    if (seconds.length < 2) { 
     seconds = '0' + seconds; 
    } 

    var clockStr = hours + ' : ' + minutes + ' : ' + seconds; 

    this.el.textContent = clockStr; 
    } 
} 

var clock = new Clock(document.getElementById('tsClock')); 
var utcButton = document.getElementById('button'); 
utcButton.addEventListener("click", utcChange); 
var utcValue = 0 

function utcChange(){ 

    if (hours < 23) { 
     utcValue += 1 
    } 
} 
+0

私はあなたがこのグローバル変数を初期化していることがわかりいけません。何かが発生した場合にもエラーを貼り付けることができますか? –

答えて

1

let hoursは、変数は、それがで定義されています関数内からのみアクセス可能であることを意味します。

は、別の関数からそれを使用してフィールドにするために。

例:

class Clock { 
    hours: number; 
    run() { 
     this.hours = ...; 
    } 
} 

function utcChange() { 
    if (clock.hours < 23) 
     // ... 
} 
3

クラスのrun機能であなたのローカル変数は、外側の変数をシャドウ。宣言からlet部分を削除します。

run() { 
    var time = new Date(); 
    hours = time.getHours()+utcValue; 
    var hoursChanged = hours.toString(); // Use without `let` 
    var minutes = time.getMinutes().toString(); 
    var seconds = time.getSeconds().toString() 
    ... 
} 

glboal変数を使用しない方がよいでしょう。変数をフィールドとして作成し、そのオブジェクトのフィールドを使用してhoursにアクセスします。

関連する問題