2016-01-19 71 views
1

在我指定我正在努力工作之前,讓我告訴你我的JavaScript代碼。JavaScript,通過函數訪問全局變量

var gVar = 0; 

$("#plus").click(function(e) { 
    e.preventDefault(); 
    gVar = gVar + 1; 
    alert(gVar); 
}); 

$("#minus").click(function(e) { 
    e.preventDefault(); 
    gVar = gVar + 1; 
    alert(gVar); 
}); 

在上面的代碼,我首先設置一個全局變量「GVAR」保持爲零的整數值。每當我點擊一個ID爲「plus」的按鈕時,全局變量'gVar'的值將增加1,這會在瀏覽器的對話框中打印出來。

同樣的事情會發生的ID爲「負」,除了「GVAR」的價值將會由1

遞減。在我試圖整理代碼上面的按鈕,我創建了一個函數分開,每當我點擊兩個按鈕時會被調用。這裏是代碼。

var gVar = 0; 

var weird = function (button, Var, num1) { 
    $(button).click(function(e){ 
     e.preventDefault(); 
     Var = Var + num1; 
     alert(Var); 
    }); 
}; 

weird("#plus", gVar, 1); 
weird("#minus", gVar, -1); 

當我運行此代碼時,'gVar'的值永遠不會改變,並始終保持'0'。

我想我隱約知道這裏的問題是什麼,但不完全確定是什麼導致了這個問題。任何意見將非常感謝,以澄清這個問題對我來說。

另外,我很好奇,是否有任何方法可以創建一個函數來實現相同的效果,而不是爲兩個不同的點擊事件編寫兩次類似的代碼。

+3

這是一個int;該參數將不是全局值。你可以創建一個帶有計數器的全局對象。 –

+4

我認爲簡單的類型參數(在你的情況下int)不是通過引用傳遞給函數,這就是爲什麼你需要傳遞一個對象類型參數給函數,因爲@DaveNewton按對象寫了 –

回答

3

在JavaScript中,只有對象是作爲參考,所有其他類型,包括數字,當你將它們分配給另一個變量複製過去了。

你能傳遞你的變量名作爲一個字符串,然後把它稱爲window[Var]

var gVar = 0; 

var weird = function (button, Var, num1) { 
    $(button).click(function(e){ 
     e.preventDefault(); 
     window[Var] = window[Var] + num1; 
     alert(window[Var]); 
    }); 
}; 

weird("#plus", "gVar", 1); 
weird("#minus", "gVar", -1); 

正如@ shiplu.mokadd.im建議,你也可以改變gVar反對:

var gVar = {value: 0}; 

var weird = function (button, Var, num1) { 
    $(button).click(function(e){ 
     e.preventDefault(); 
     Var.value = Var.value + num1; 
     alert(Var.value); 
    }); 
}; 

weird("#plus", gVar, 1); 
weird("#minus", gVar, -1); 
1

無論函數是什麼,您都不能重新分配參數,並期望範圍反映該變化。然而,根據參數,你可以修改它(即,如果gVar是對象或數組)。我建議你閱讀關於通過引用/值來更好地瞭解這是什麼意思here

全局變量的本質是它是整個程序的全局,因此 - 不需要作爲參數傳遞給任何函數。

所以無需修改你太多的原代碼

var gVar = 0; 

var weird = function (button, num1) { 
    $(button).click(function(e){ 
     e.preventDefault(); 
     gVar += num1; 
     alert(Var); 
    }); 
}; 

weird("#plus", 1); 
weird("#minus", -1); 
+1

,我的意思是JS世界 - 即一個類的實例或匿名對象'{}'。同意一個數組是Array類的一個實例,所以從技術上講,它絕對是一個對象。 所以是的,所有的對象都通過引用傳遞。但我們通常喜歡區分「對象」和「數組」 - 它依賴於上下文。 – Antiokus

0

var gVar = { 
 
    value: 0 
 
}; 
 

 
var weird = function(button, Var, num1) { 
 
    $(button).click(function(e) { 
 
    e.preventDefault(); 
 
    Var.value = Var.value + num1; 
 
    alert(Var.value); 
 
    }); 
 
}; 
 

 
weird("#plus", gVar, 1); 
 
weird("#minus", gVar, -1);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="button" value="+" id="plus"> 
 
<br> 
 
<input type="button" value="-" id="minus">

+0

這基本上是我答案的副本。 –