2011-10-21 6 views
3

私はスコープの問題を抱えています。ここに私のコードのサンプルです:JavaScriptを使って変数を宣言するためにvarを使う

$(document).ready(function() { 

var counter = 0; 

function scrollTweets() { 
    counter ++; 
    // rest of code 
} 

... 

)}; // end of document ready 

私はChromeのJavaScriptコンソールに変数counterを検索すると、それは「ReferencedError」を返します。しかし、上記のコードからvarを削除し、コンソールにcounterと入力すると、値が返されます。どうしてこれなの?

この単純な概念を理解すれば、開発中にポップアップするような問題に取り組むことができると思います。 Chromeの一部にはスコープ上の問題はありますか?私は不必要に "function"の$(document).readyのすべてをラップしていますか?

+2

グローバルにしないでください! 'counter'を調べる場合は、コードにブレークポイントを設定します。これにより、さまざまなレベルのクロージャでの変数の現在の状態を調べることができます。あるいは単に 'console.log()'を使って値を記録してください。 – user113716

+0

ありがとう@Ӫ_._Ӫ...それは良いテクニックです! – pruett

答えて

7

varはレキシカルスコープが何であれに変数counterをロック - 現在のブロックでの利用可能を意味し、あなたがやっているように、この方法は、何でも、とは、閉鎖型のスコープ(。すなわち閉鎖)に取り付けることができますscrollTweetsとなります。だからcounterreadyコールバックとその周りにクロージャーを持つものでしか利用できないため、コンソールからアクセスできません。

varを削除すると、counterは効果的にグローバルになります。そのため、その場合にアクセスできます。

+0

ありがとう、非常に有用な情報。 – pruett

5

varを使用して変数の有効範囲を設定しないと、自動的にグローバルスコープ内のグローバル変数になります。それがChromeコンソールに表示される理由です

これは、変数をグローバルにする必要があることを意味するものではありません。実際、それはほとんど常に悪い考えです!変数が使用されているスコープのコンテキストで変数をキャプチャするのが適切です。 Chromeコンソールで処理できない場合は、より優れたデバッガが必要です。 Javascript用のFirebugは、スコープを扱う際に素晴らしい仕事をします。

+0

ありがとう!非常に役立ちます。私は火かき棒を試してみます – pruett

+0

@pruett、ちょうど混乱を避けるために、FirebugはFirefoxでのみ利用可能です。しかし、非常に強力なデバッガであるため、デバッグ用のブラウザとしてFFを使用する価値があります。 –

関連する問題