为什么我的函数不采用全局变量?

时间:2017-11-07 16:12:51

标签: javascript

我真的不知道 avanx *= -1 函数内的avany *= -1movimiento为什么不改变全局变量的信号。



// VARIABLES GLOBALES 
var bola1 = document.getElementById("bola1");
var bola2 = document.getElementById("bola2");

var avancex = 1;
var avancey = 1;
var avancex2 = 1;
var avancey2 = 1;

function movimiento(bola, avanx, avany) {
  bola.setAttribute("cx", parseInt(bola.getAttribute("cx")) + avanx);
  bola.setAttribute("cy", parseInt(bola.getAttribute("cy")) + avany);

  var positionx = parseInt(bola.getAttribute("cx"));
  var positiony = parseInt(bola.getAttribute("cy"));

  if ((positionx + 50) >= 1000 || (positionx + 50) <= 0) {
    avanx *= -1;
  } else if ((positiony + 50) >= 800 || (positiony + 50) <= 0) {
    avany *= -1;
  }
}

setInterval(function() {
  movimiento(bola1, avancex, avancey);
  movimiento(bola2, avancex2, avancey2);
}, 1000 / 60);
&#13;
<svg id="svg" height="800" width="1000" xmlns="http://www.w3.org/2000/svg">
<circle id="bola1" cx="100" cy="100" r="50" fill="red"></circle>
<circle id="bola2" cx="700" cy="100" r="50" fill="grey"></circle>
</svg>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:1)

JavaScript通过值始终传递参数。因此,实际上,您只修改传入的值的副本,而不是实际的全局变量。

您可以将具有这些值的对象作为属性传递,并以这种方式修改属性。或者只是直接使用全局变量(但我强烈反对)。

答案 1 :(得分:0)

 if ((positionx + 50) >= 1000 || (positionx + 50) <= 0) {
        avanx *= -1;
    } else if ((positiony + 50) >= 800 || (positiony + 50) <= 0) {
        avany *= -1;
    }

您不会更改全局变量的值。

if ((positionx + 50) >= 1000 || (positionx + 50) <= 0) {
        avancex *= -1;
    } else if ((positiony + 50) >= 800 || (positiony + 50) <= 0) {
        avancey *= -1;
    }

答案 2 :(得分:0)

您正在做的是更改参数的值,而不是全局变量本身。

让我用更多细节解释一下:

JavaScript参数中的

是按值传递的,而不是通过引用传递的。当您致电movimiento(bola1, avancex, avancey)时,您基本上复制 bola1(全局变量)bola(本地参数)的值,这是一个完全的不同的变量

如果修改bola内的参数(movimiento),则会对参数本身进行更改,这是bola1的本地副本,因此更改不会应用于原始参数(bola1)。记住:在JS中,实际参数和形式参数总是两个不同的东西同时存在于内存中,如果你改变一个它不会影响另一个。

关于对象参数的注意事项

小心对象,因为它们确实在参数中被复制为普通原始变量,但它们未被克隆。这意味着实际和形式参数仍然是两个不同的变量,但它们是&#34; 指针&#34;引用相同的地址,因此将属性更改为 会更改另一个