【问题标题】:function setting variable when it shouldn't函数设置变量不应该
【发布时间】:2011-05-09 23:49:38
【问题描述】:
function genEnemy(a) {
 //javascript:alert(en[0]+'\n'+genEnemy(en[0])+'\n'+en[0])
 with (Math) {
  a[1]=round(a[1]*(.5+random()))
  a[2]=round(a[2]*(1+random()))
  for (var b=0;b<5;b++) a[3][b]=round(a[3][b]*(a[3][b]/2+random()*a[3][b]/10))
  for (var b=0;b<a[4].length;b++) random()<it[a[4][b]][3]/10?a[4][b]=0:0
  }
 return a
 }

在给定每个敌人阵列的基地的情况下生成敌人统计数据的脚本。 (角色扮演游戏) 问题是,当我期望它返回一个包含新统计数据的数组时,它也会将敌人数组设置为新数组。为什么是这样?显然,您可以看到问题是如何由此引起的(基地正在改变,因此弱小的敌人可以变得超级强大)。我将如何阻止它在 en(敌人值数组)中设​​置数组?

【问题讨论】:

  • 我没有按照你想要的去做,你的变量名使得很难根据描述来解码你的代码。
  • with (Obj) 可能很危险,请务必阅读this

标签: javascript arrays variables return


【解决方案1】:

对象在 JavaScript 中通过引用传递。这意味着您对genEnemy 中的数组a 所做的任何更改都会反映在传入的原始数组上。您需要制作数组的深层副本并返回此副本。这是一个可以为您完成的功能:

function cloneArray(a) {
  var b = [];
  for (var i = 0; i < a.length; i++)
    if (a[i] instanceof Array)
      b[i] = cloneArray(a[i]);
    else
      b[i] = a[i];
  return b;
}

genEnemy 中,你会这样做:

a = cloneArray(a);
// make changes to the new array
return a;

另外,不要忘记在代码中包含分号。即使它们是可选的,但如果您养成省略它们的习惯,您可能会遇到意想不到的问题。

【讨论】:

  • 有没有办法在没有其他功能的情况下做到这一点?我只是讨厌为小事添加功能。
  • @Ruffian 取出函数体并按程序运行它,你没有函数 :P 但是记住将经常使用和有用的代码变成函数是一件好事。
  • @Ruffian:如果有内置函数,我肯定会建议这样做。可惜没有。
  • 嗯。我将取出 genEnemy 函数并找到一种方法将其放入更大的函数中以设置整个战斗。还是谢谢。
  • @Ruffian 小心这种想法 - 抽象成单独的函数是一件的事情!
【解决方案2】:

您是否将数组 en 传递给您的 getEnemy() 函数?如果是这样,那么它将更改 en 数组中的值,因为它是按引用而不是按值传递的

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 2016-02-02
    • 2016-12-23
    • 2015-02-16
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多