2011-10-21 64 views
3

我正在努力(我相信是)範圍問題。這裏是我的代碼示例:使用var在Javascript中聲明變量

$(document).ready(function() { 

var counter = 0; 

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

... 

)}; // end of document ready 

當我看到了在Chrome的JavaScript控制檯變量counter返回「ReferencedError」。但是,當我從上面的代碼中刪除var並在控制檯中輸入counter時,它會返回值。爲什麼是這樣?

我認爲理解這個簡單的概念可以讓我解決在開發過程中似乎會出現的問題。這只是Chrome的一部分範圍問題嗎?我是否不必要地在$(document).ready「功能」中包裝了所有內容?

+2

不要讓它成爲全球!如果你想檢查'counter',那麼在代碼中設置一個斷點。這將允許您檢查各種關閉級別的變量的當前狀態。或者只需使用'console.log()'記錄該值。 – user113716

+0

謝謝@Ӫ_._Ӫ...這是一項很好的技術! – pruett

回答

7

var鎖定可變counter成任何詞彙範圍是 - 這意味着其在當前塊中可用的,方法,不管,並且可以連接到封閉在範圍(即封閉。),如你正在做與scrollTweets。所以counter僅在ready回調以及任何周圍有閉包的東西中可用,這就是爲什麼您無法從控制檯訪問它的原因。

當你將var帶走時,counter實際上是全局性的,這就是爲什麼你可以在這種情況下訪問它。

+0

感謝,非常有用的信息。 – pruett

5

當您不使用var來設置變量的作用域時,它會自動變成全局變量的全局變量。這就是它在Chrome控制檯中可見的原因。

作爲一個說明,我絕不意味着你應該讓全局變量。事實上,這幾乎總是一個壞主意!在使用範圍的上下文中捕獲變量是正確的。如果Chrome控制檯無法處理,您只需要更好的調試器。用於Javascript的Firebug在處理範圍方面做得非常出色 - 甚至是clojures!

+0

謝謝!很有幫助。我會給螢火蟲試一試 – pruett

+0

@pruett,爲了避免混淆,Firebug僅適用於Firefox。但是因爲它是一個非常強大的調試器,所以在使用FF作爲您的調試瀏覽器時可能會值得。 –