小编典典

为什么我的球(物体)没有缩小/消失?

all

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

阅读 120

收藏
2022-06-27

共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。)

您可以先尝试移出asplodeshrink

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(function() { shrink(p) }, 100)
    
  • 您的代码for (var i = 0; i < 100; i++) { p.radius -= 1; }可能不会像您认为的那样做。这将立即运行减量操作 100 次, 然后 直观地显示结果。如果您想以每个新尺寸重新渲染球,您将需要在单独的时间回调(如setInterval操作)中执行每个单独的递减。

  • .splice需要一个数字索引,而不是一个对象。您可以通过以下方式获取对象的数字索引indexOf

    balls.splice(balls.indexOf(p), 1);
    
  • 当您的间隔第一次运行时,该balls.splice语句已经发生(确切地说,它发生在大约 100 毫秒前)。我认为这不是你想要的。相反,您应该有一个递减函数,该函数被重复调用setInterval并最终在balls.splice(p,1)之后执行p.radius == 0

2022-06-27