【问题标题】:Changing a global variable in an function JS [duplicate]更改函数JS中的全局变量[重复]
【发布时间】:2014-09-06 04:14:48
【问题描述】:

我在网上查看了有关更改函数中的变量的信息,但仍然不起作用。

我正在尝试更改函数中的全局变量。带有数字的对象相互相乘。该函数将多次使用不同的全局变量。所以不想直接使用那里的名字。

代码在这里

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);

答案显示为未定义。谁能解释一下,谢谢

【问题讨论】:

标签: javascript


【解决方案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);

【讨论】:

    【解决方案2】:

    如果您需要使用全局范围并希望传递 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

    【讨论】:

    • 虽然这行得通,但它是解决 IMO 问题的一种奇怪方法。
    • 我想解释一下为什么他的ans变量总是为零并且没有在外部范围内更新
    • 对;您对问题的解释是正确的,我只是认为您的 solution 很奇怪,使用对象而不是返回值。这似乎是一个过于复杂的修复。
    【解决方案3】:

    嗯,这里有一些事情要做:

    首先,当我运行您的代码时,我收到一个引用错误,因为 homeTeamOppW 未定义。你有一个错字。

    第二个你从来没有真正更新过ans;它按值传递。所以它永远不会从0改变。

    话虽如此,当我运行您的代码(将 homeTeamOppW 更改为 homeTeamoppw)时,它会打印出 0,这是我所期望的。

    如果您更改函数以返回 @Mathletics 显示的值并修复错字,我认为它可以满足您的需求。或者,您可以直接在函数末尾重新分配ans

    【讨论】:

      【解决方案4】:

      我认为你的意思是这样的:

      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(不知道这是否是预期的输出)。

      【讨论】:

      • 这与我的回答有何不同?
      • 不是。可能是在答案飞来的时候才提交的:-)
      【解决方案5】:

      该函数将拥有自己的副本(函数的本地副本),并且不会实际修改全局 var ans 的内容。您可以尝试分配函数在函数体内返回的任何值,而不是将 ans 作为参数传递。

      谢谢

      【讨论】:

        猜你喜欢
        • 2019-10-03
        • 1970-01-01
        • 2020-10-02
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多