2014-07-15 49 views
2

我已經在線查看有關函數中變化的變量,但仍然無效。更改函數中的全局變量JS

我想改變函數中的全局變量。一個有數字的對象相互相乘。該函數將使用幾個不同的全局變量。所以不要直接使用那裏的名字。

這裏是代碼

var homeTeamOppw = {"last_gp": 0.2, "2nd_gp": 0.2, "3rd_gp": 0.8, "4th_gp": 0.4, "5th_gp": 0.8}; 
ans = 0; 

function timesArrayitems(teamOpp, array){ 
    var num = 1; 

    for(item in array){ 
    num = num * array[item]; 
    } 

    teamOpp = num; 
} 

timesArrayitems(ans, homeTeamOppW); 
console.log(ans); 

俺們出來作爲取消定義。有人可以解釋請和謝謝

+1

http://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference – mplungjan

+1

你實際上並沒有'timesArrayitems更新'ans'()',你傳遞它作爲參考,它被用作'function'內的'local var teamOpp'作用域。 –

回答

1

您的功能只改變本地副本,teamOpp。您應該返回一個值並將其設置爲ans

var homeTeamOppW = {"last_gp": 0.2, "2nd_gp": 0.2, "3rd_gp": 0.8, "4th_gp": 0.4, "5th_gp": 0.8}; 
ans = 0; 

function timesArrayitems(array){ // note only one param 
    var num = 1; 

    for(item in array){ 

     num = num * array[item]; 
    } 

    return num; // note return value 

} 

ans = timesArrayitems(homeTeamOppW); 
console.log(ans); 
0

如果您需要全球範圍內玩,想通過ANS,ANS必須是一個對象,而不是隻是一個變量,當你調用它會按值傳遞的函數,如果對象是通過了然後通過引用傳遞。

代碼段:

var homeTeamOppw = {"last_gp": 0.2, "2nd_gp": 0.2, "3rd_gp": 0.8, "4th_gp": 0.4, "5th_gp": 0.8}; 
ans = {val:0}; 

function timesArrayitems(teamOpp, array){ 

var num = 1; 

for(item in array){ 

    num = num * array[item]; 
} 

    teamOpp.val = num; 

} 

timesArrayitems(ans, homeTeamOppw); 
console.log(ans); 

Fiddle

+0

雖然這個工程,這是一個奇怪的方式來解決這個問題國際海事組織。 – Mathletics

+0

我想解釋爲什麼他的ans變量總是爲零並且沒有在外部範圍內更新 – V31

+0

正確;你對問題的解釋是正確的,我只是認爲你的_solution_很奇怪,使用一個對象而不是返回一個值。這似乎是一個過於複雜的修復。 – Mathletics

0

好吧,你有幾件事情會在這裏:

首先,當我運行代碼,我得到一個參考錯誤,因爲homeTeamOppW沒有定義。你有一個錯字。

其次你永遠不會更新ans;它通過價值傳遞。所以它永遠不會從0改變。

這就是說,當我運行你的代碼(改變homeTeamOppWhomeTeamoppw)它打印0這是我所期望的。

如果您更改該函數以返回值作爲@Mathletics顯示並修復該錯字,我認爲它會按照您的要求進行操作。或者,您可以直接在函數的末尾重新分配ans

1

我想你的意思是這樣的:

var homeTeamOppw = {"last_gp": 0.2, "2nd_gp": 0.2, "3rd_gp": 0.8, "4th_gp": 0.4, "5th_gp": 0.8}; 
ans = 0; 

function timesArrayitems(array){ 
    var num = 1.0; 

    for(item in array){ 
    num = num * array[item]; 
    } 
    return num; 
} 

ans = timesArrayitems(homeTeamOppw); 
console.log(ans); 

ANS返回0.01024000004(不知道這是否是預期的輸出)。

+0

這與我的回答有什麼不同? – Mathletics

+0

它不是。可能剛剛提交的答案是在飛行中:-) – Biketire

+0

時間戳,壽。 – Mathletics

0

該函數將擁有自己的副本(本地函數),並不會實際修改您的全局變量的內容。不要將ans作爲參數傳遞,你可以嘗試賦值函數體內返回的任何值。

感謝