为什么我的球(物体)不收缩/消失?
http://jsfiddle.net/goldrunt/jGL84/42/这是从这个JS小提琴84行。 通过取消注释141-146行,可以将3种不同的效果应用于球。 “反弹”的效果是应该的,但“疯狂”的效果什么都不做。 我应该在asplode函数中包含“缩小”函数吗?
// balls shrink and disappear if they touch var shrink = function(p) { for (var i = 0; i < 100; i++) { p.radius -= 1; } function asplode(p) { setInterval(shrink(p),100); balls.splice(p, 1); } }
你的代码有一些问题。
首先,在您的定义中:
var shrink = function(p) { for (var i = 0; i < 100; i++) { p.radius -= 1; } function asplode(p) { setInterval(shrink(p),100); balls.splice(p, 1); } }
asplode
是shrink
范围内的本地范围,因此无法访问update
中您尝试调用它的代码。 JavaScript范围是基于函数的,所以update
不能看到asplode
因为它不在shrink
。 ( 在您的控制台中 ,您将看到如下错误: Uncaught ReferenceError: asplode is not defined
。)
您可能会先尝试将asplode
移到asplode
外部:
var shrink = function(p) { for (var i = 0; i < 100; i++) { p.radius -= 1; } } function asplode(p) { setInterval(shrink(p),100); balls.splice(p, 1); }
但是,您的代码还有几个问题超出了这个问题的范围:
-
setInterval
需要一个函数。setInterval(shrink(p), 100)
使setInterval
获得立即调用的shrink(p)
的返回值 。 你可能想要setInterval(function() { shrink(p) }, 100)
-
你的代码
for (var i = 0; i < 100; i++) { p.radius -= 1; }
for (var i = 0; i < 100; i++) { p.radius -= 1; }
可能不会做你认为的事情。 这将立即执行递减操作100次, 然后直观显示结果。 如果你想以每个新的尺寸重新渲染球,你将需要在一个单独的计时callback中执行每个单独的递减(比如一个setInterval
操作)。 -
.splice
需要一个数字索引,而不是一个对象。 您可以使用indexOf
获取对象的数字索引:balls.splice(balls.indexOf(p), 1);
-
当你的间隔第一次运行的时候,
balls.splice
声明已经发生了(确切的说,它发生在大约100ms前)。 我认为这不是你想要的。 相反,你应该有一个减量函数,它被setInterval
重复调用,最后在p.radius == 0
之后执行balls.splice(p,1)
。
setInterval(shrink(p),100);
这不符合你的想法。 这个调用shrink
,传递它,然后将结果传递给setInterval
。 shrink(p)
返回undefined
,所以这一行实际上并没有放置任何内容。
你可能想要:
setInterval(function(){ shrink(p) }, 100);