2012-04-20 96 views
0

今天我遇到了一個奇怪的問題。將全局變量var的名稱傳遞給函數以改變var?

好:我成功地從一個函數內改變了一個全局var值(換句話說,當「passedVarName」被替換爲「a」時,下面的例子工作正常)。

糟糕:當試圖傳遞全局變量名稱「a」(而不是直接將其放入函數中)時,它無法工作。

下面是表裏如一,我不能讓工作:

(上點擊文件應該寫 「2」,而是寫 「南」?)

的Javascript:

var a = 1; 

    function click(passedVarName){ 

    passedVarName ++; 

    document.write(passedVarName) 

    }; 

HTML:

<a href="javascript:click('a')">Click this Button to alter global var "a".</a> 
+0

道歉HTML應該讀取:Click this Button to alter global var "a".。 – user1345660 2012-04-20 05:37:02

回答

0

傳遞一個全局變量作爲一個參數去一個函數創建函數內部的VAR的副本。全球並沒有改變。

這個例子將產生相同的輸出每次你點擊第一個div:

//html 
<div onclick="foo(a)">Click here</div> 
<div id="txt"></div>​​​​​​​​​​​​​ 
//js 
window.a = 152; 
window.foo = function(varr) {varr++; $("#txt").html(varr)}​ 

但是,好像如果你通過變量作爲一個對象的屬性,傳遞對象的功能,並且裏面你的函數修改變量,它具有全球性的影響:

//html 
<div onclick="foo(a)">Click here</div> 
<div id="txt"></div>​​​​​​​​​​​​​​​​ 
//js 
window.a = { val:152}; 
window.foo = function(varr) {varr.val++; $("#txt").html(varr.val)}​ 

這裏是一個的jsfiddle的作品:http://jsfiddle.net/2Ahdb/3/

+0

不錯的工作!這看起來像在我的函數中使用「window []」的一個很好的乾淨選擇。謝謝! – user1345660 2012-04-20 17:21:11

1

單擊此按鈕可以更改全局變量「a」。

這將字符串'a'傳遞給你的函數,而不是變量a。 你需要把它作爲click(a);

更正例如: http://html-bin.appspot.com/aghodG1sLWJpbnIMCxIEUGFnZRjhjxoM

[未使用jsfiddle.net被分隔條件JavaScript和HTML,以避免混淆]

+0

準確地說,NaN的意思是'不是數字'(你不能增加一個字符串......) – 2012-04-20 05:45:12

2

這是一個非常糟糕的代碼味道,但如果你知道這是全球性的,那麼這會工作:

var a = 1; 

function click(passedVarName){ 

    window[passedVarName]++; 

    document.write(passedVarName) 

}; 
+0

謝謝你做到了!如果你不介意是什麼讓它聞起來不好? :)我非常感謝一個更清潔的替代品。 – user1345660 2012-04-20 05:52:17

+0

@ user1345660在這種情況下,不好的代碼味道我相信指的是對'window'對象的顯式引用,而不是使用對作爲參數傳入的變量的引用。 @DhruvPathat已經在你的代碼中指出了錯誤,並給了你一個工作的例子。 – 2012-04-20 07:41:18

+0

是的,但在他的例子中,他只是改變傳遞給函數的值,而不是變量本身。實際的全局變量不幸保持在1.這就是爲什麼window [passedVarName]似乎是必要的。 – user1345660 2012-04-20 16:59:58

0

原諒我如果我錯誤地理解了編程知識,但是全局變量是可以通過編程的任何部分訪問和修改的東西,那麼您不需要通過函數傳遞它來修改它。

如果您嘗試通過函數來​​修改全局變量,javascript有一些限制。只有對象通過引用傳遞。

var a = 5; 
var b = { value: 5 }; 


function changeMe(x) { 
    x = 10; 
} 
changeMe(a); //... still 5 

function changeMeAlso(x) { 
    x.value = 10; 
} 
changeMeAlso(b); //.. changed to { value: 10 }