为什么我的球(物体)不收缩/消失?

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

asplodeshrink范围内的本地范围,因此无法访问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 ,传递它,然后将结果传递给setIntervalshrink(p)返回undefined ,所以这一行实际上并没有放置任何内容。

你可能想要:

 setInterval(function(){ shrink(p) }, 100);