2011-12-17 55 views
3

我在定義一個新變量時使用var關鍵字閱讀了一些帖子。帖子提到如何在一個函數內使用var創建一個局部範圍的變量,而不使用var關鍵字創建一個具有全局範圍的變量。大多數帖子建議始終使用var。我有幾個問題:在Javascript中定義變量時使用var關鍵字

  1. 我學習JS,我試圖寫一個計數的次按鈕被點擊數的腳本(請參見下面的代碼)。如果在功能totalClickselse部分,我使用var numclicks = 1;,那麼下面的代碼不工作。如果我省略了var關鍵字,它可以工作。這是因爲代碼工作numclicks需要是一個全局變量,還是有其他一些原因?這是否應該總是使用var的規則是一個例外,或者有另一種方法來編程。

  2. 第一次單擊該按鈕時,輸出爲NaN。我不清楚爲什麼它不是1?遵循代碼的邏輯,在寫入文檔之前,該變量看起來被設置爲1。我知道如果在函數聲明之前添加numclick = 0;,問題就解決了。但我不清楚爲什麼這能解決問題。

非常感謝您的幫助。

CODE

<html> 
<head> 
    <title>Count number of clicks</title> 
</head> 
<body> 

    <form> 
     <input type="button" value="click here" onclick="totalClicks();"> 
    </form> 

Total clicks: <span id="numclicks"></span> 

    <script type="text/javascript"> 
     function totalClicks(){ 
      if (window.numclicks) { 
       numclicks++; 
      } 
      else { 
       numclicks = 1; 
      } 

      document.getElementById("numclicks").innerHTML = numclicks; 

     } 
    </script> 

</body> 
</html 
+1

Slava給出了一個礦石的完整答案,但對於您的信息,Javascript具有相當瘋狂的吊裝概念。一旦你理解了它,這真的很簡單,直到你做的事情看起來真的很bizzarre。這裏是一個非常簡短的文章:http:// elegantcode。com/2010/12/24/basic-javascript-part-5-hoisting/ – 2011-12-17 22:51:25

+0

@George Mauer我喜歡該網站的網頁設計:) – ajax333221 2011-12-17 23:01:59

+0

@ George - 感謝您的聯繫。我查過這篇文章,但以下內容仍不清楚。作者說:「但函數範圍意味着在函數中聲明的所有變量和參數在該函數內的任何地方都是可見的,即使在聲明該變量之前。」如果它們在任何地方都可見,爲什麼第一個輸出是'undefined''。 「到處可見」是什麼意思? – Curious2learn 2011-12-17 23:39:01

回答

0

試試這個:

<html> 
<head> 
    <title>Count number of clicks</title> 
</head> 
<body> 

    <form> 
     <input type="button" value="click here" onclick="totalClicks();"> 
    </form> 

Total clicks: <span id="numclicks"></span> 

    <script type="text/javascript"> 
     function totalClicks(){ 
      var numClicks = document.getElementById("numclicks").value; 

      if (numclicks > 0) { 
       numclicks++; 
      } 
      else { 
       numclicks = 1; 
      } 

      document.getElementById("numclicks").innerHTML = numclicks; 

     } 
    </script> 

</body> 
</html> 
+1

儘管這可能有效,但它是全球變量的一個醜陋而低效的替代品。 – Fantius 2011-12-17 23:13:23

+0

9.停止觸摸DOM,該死! http://jonraasch.com/blog/10-javascript-performance-boosting-tips-from-nicholas-zakas – ajax333221 2011-12-17 23:18:53

0
  1. 當然它必須是一個全局變量。

    這是因爲局部變量的範圍一旦到達totalClicks()函數的末尾就會死亡。

  2. 我不知道是什麼原因造成的,但將numclicks設置爲0外部函數應該有所幫助。將window.numclicks設置爲0,並始終使用window.numclicks,以便始終可以看到哪個是全局變量。 (全球範圍內往往是即使它是建立在許多語言經常眉頭一皺非常實用)

2
  1. 第一次定義numclicks,它需要使它成爲全球是任何功能之外。使用var,同時仍然在函數內定義一個變量不會使其成爲全局變量。在函數內部使用全局變量var會使其成爲局部變量。

  2. 您有一個ID爲numclicks的元素,因此window.numclicks默認情況下指向該元素。

+0

謝謝Jcubed。改變id解決了NaN的問題。 – Curious2learn 2011-12-17 23:40:10