2016-06-15 65 views
1

這真讓我感到害怕。在JavaScript中使用var關鍵字在函數外聲明變量

我想改變我的圖像的源屬性,當使用JavaScript關鍵詞單擊時。

雖然我看過的一些視頻確實幫助我做到了,但使用的方法確實令人困惑。

請你們其中一個人體驗民間,請向我解釋這一點。

<html> 
    <head> 
     <script> 
      var image_tracker = 'p'; 
      function change() { 
       var image = document.getElementById('pics'); 
       if (image_tracker == 'p') { 
        image.src = 'Tulips.jpg'; 
        image_tracker = 't'; 
       } else { 
        image.src = 'Penguins.jpg'; 
        image_tracker = 'p'; 
       } 
      } 
     </script> 
     <title></title> 
    </head> 
    <body> 
     <h1>JavaScript Tutorial</h1> 
     <img src="Penguins.jpg" alt="pics" id="demo" onclick="change();"> 
    </body> 
</html> 

我的實際困惑是,不可能在函數內部聲明跟蹤器變量?

我實際上嘗試在函數內部聲明它,但它不起作用。

請好人們,告訴我什麼我不知道。

我的實際困惑是爲什麼我不能在函數內聲明變量跟蹤器?

請不要介意代碼,我的困惑就是變量聲明

+3

首先,你的'function'沒有名字。其次,發佈一些html來說明你想要的行爲,並幫助我們理解它。 –

+0

感謝您的回覆。 – pedroyanky

回答

-1

,如果你裏面定義它,然後每次運行函數時,「跟蹤」將被初始化

1

首先,添加一個函數名稱。

至於爲什麼聲明函數內部的變量是不行的,這是因爲如果你這樣做,你每次調用函數時,變量將被重置爲在你的情況下,其原始值,即t。由於您希望此值在多個函數調用中保持不變,因此您需要某種方式將該值存儲在某個位置,以便在下次調用該函數時獲取上次存儲的值。

您可以在沒有關鍵字var的函數中定義變量。這將使其成爲全球性的。我不確定這是否是解決您問題的最佳方法,但這是可行的。

function change() { 
    tracker = 't'; 
    var image = document.getElementById('img'); 

    if (tracker == 't') { 
    image.src = 'photo.jpg'; 
    tracker = 'f'; 
    } else { 
    image.src = 'picture.jpg'; 
    tracker = 't'; 
    } 
} 

如果你想避免tracker爲全局變量,另一種方法可能是值保存在你的img標籤本身data屬性。因此,每次運行函數時,首先獲取屬性值,相應地執行代碼,然後將新的更新值保存到屬性中。

<img data-tracker="t" src="Penguins.jpg" alt="pics" id="demo" onclick="change();"> 

function change() { 
    var image = document.getElementById('img'); 
    var tracker = image.getAttribute("data-tracker"); 

    if (tracker == 't') { 
    image.src = 'photo.jpg'; 
    // tracker = 'f'; 
    image.setAttribute("data-tracker", "f"); 
    } else { 
    image.src = 'picture.jpg'; 
    // tracker = 't'; 
    image.setAttribute("data-tracker", "t"); 
    } 
} 
+1

儘管沒有使用'var'是一個不好的習慣,它並沒有回答「爲什麼聲明裏面不行」... –

+1

謝謝@ ADreNaLiNe-DJ。編輯我的答案包括這一點。 –

+0

如果你想避免把'tracker'作爲一個全局變量,另一種方法可能是將'data'屬性保存爲'img'標籤本身。因此,每次運行函數時,首先獲取屬性值,相應地執行代碼,然後將新的更新值保存到屬性中。這怎麼可能 – pedroyanky

3

您聲明瞭函數外的變量來保留它的下一個函數調用的值。

如果你聲明它裏面的功能比它的價值將在未來的函數調用進行復位:

var trigger1 = 'f'; 
 

 
function testTrigger() { 
 
    var trigger2 = 'f'; 
 
    console.log('Trigger 1: ' + trigger1 + ' | Trigger 2: ' + trigger2); 
 
    
 
    if (trigger1 == 't') { 
 
    trigger1 = 'f'; 
 
    trigger2 = 'f'; 
 
    } else { 
 
    trigger1 = 't'; 
 
    trigger2 = 't'; 
 
    } 
 
} 
 

 
testTrigger(); 
 
testTrigger(); 
 
testTrigger(); 
 
testTrigger();
所有的

相關問題