我真的不知道 avanx *= -1
函数内的avany *= -1
和movimiento
为什么不改变全局变量的信号。
// 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;
答案 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;引用相同的地址,因此将属性更改为 会更改另一个
。