http://jsfiddle.net/goldrunt/jGL84/42/ 这是来自这个 JS fiddle 的第 84 行。通过取消注释第 141-146 行,可以对球应用 3 种不同的效果。’bounce’ 效果可以正常工作,但 ‘asplode’ 效果什么也不做。我应该在 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的代码无法访问。updateJavaScript 作用域是基于函数的,所以update看不到asplode,因为它不在shrink. (在您的控制台中,您会看到如下错误:Uncaught ReferenceError: asplode is not defined。)
asplode
shrink
update
Uncaught ReferenceError: asplode is not defined
您可以先尝试移出asplode:shrink
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获取 immediate-invoked 的 返回值 。你可能想要 __shrink(p)
setInterval
setInterval(shrink(p), 100)
shrink(p)
setInterval(function() { shrink(p) }, 100)
您的代码for (var i = 0; i < 100; i++) { p.radius -= 1; }可能不会像您认为的那样做。这将立即运行减量操作 100 次, 然后 直观地显示结果。如果您想以每个新尺寸重新渲染球,您将需要在单独的时间回调(如setInterval操作)中执行每个单独的递减。
for (var i = 0; i < 100; i++) { p.radius -= 1; }
.splice需要一个数字索引,而不是一个对象。您可以通过以下方式获取对象的数字索引indexOf:
.splice
indexOf
balls.splice(balls.indexOf(p), 1);
当您的间隔第一次运行时,该balls.splice语句已经发生(确切地说,它发生在大约 100 毫秒前)。我认为这不是你想要的。相反,您应该有一个递减函数,该函数被重复调用setInterval并最终在balls.splice(p,1)之后执行p.radius == 0。
balls.splice
balls.splice(p,1)
p.radius == 0