2014-07-15 50 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作为参数传递,你可以尝试赋值函数体内返回的任何值。

感谢