2017-07-21 27 views
0

多分それは愚かな質問ですが、と:Javascriptでは、グローバル変数の値をイベントコンテキスト内から変更できますか?

var a = { 
    scrolled: false 
}; 

var handler = function() { 
    a.scrolled = true; 
    console.log(a.scrolled); // always "true" 
}; 

window.addEventListener('scroll', handler); 
console.log(a.scrolled); // always "false" 

「外」のコンテキストにイベント内からa.scrolledの値を変えるチャンスがありませんか?

おかげで....

+0

グローバル変数はグローバル変数です。あなたはいつでもそれらに行くことができます。ブラウザのグローバルオブジェクトである 'window'を使って参照を完全修飾する必要があるかもしれません。 –

答えて

2

あなたのハンドラは、スクロールにトリガ、あなたがスクロールするまでa.scrolledfalseです。ただし、11行目のconsole.log(a.scrolled)は、スクロールした後ではなく、JSが読み込まれたときに実行されるので、スクリプトの開始時にfalseが印刷されます。

あなたがスクロールを開始すると、

でライン8回のキックであなたの他のconsole.log(a.scrolled)だから何があなたのコンソールに表示されますが、このようなものです:。

false 
true 
true 
true 
true 

最初false出力はラインからです図11に示すように、残りはライン8のハンドラの内側にある。

0

あなたのコードでは、値を変更し、そしてそれはとてもグローバル(あなたのコードはグローバルスコープであると仮定すると)ん。

console.log(a.scrolled); // always "false" 

あなたが値を変更するときあなたが値を変更するためです。

値を変更すると過去に移動してコンソールに印刷する前に変更する時間がかかりません。

過去に印刷した出力は変更されません。

+0

私は、スクロールイベントが発生したとき、私が最初に "false"と設定したグローバルな値が変わると思っていました... – AmintaCode

+0

私はあなたが言うことを得ていると思いますが、あなたの答えは本当に難しい理解する。たぶん言葉遣いですが、プログラミングの "時間旅行"について話すだけで、私の意見では混乱が増えます。 –

+0

@AmintaCode - そうです。変更する前に出力した出力は画面に表示されません。 – Quentin

-1

すべての人に、特に@ patrick-robertsのおかげで、正しい例がわかりました。これは非同期コードリファレンスの問題ですが、私はこの質問/回答を例として考えています。

var a = { 
    scrolled: false 
}; 

var handler = function() { 
    a.scrolled = true; 
}; 

window.addEventListener('scroll', handler); 

setTimeout(function() { 
     console.log(a.scrolled)} 
     , 10000); 

// a.scrolled is kept "false" if, in 10 seconds, no scroll event happens... 
関連する問題