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


208

http://jsfiddle.net/goldrunt/jGL84/42/ 这是来自JS小提琴的第84行。通过取消注释线141-146,可以将3种不同的效果应用于球。“弹跳”效果按其应有的方式起作用,但“ 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);
    }
}

12
asplode未在全局范围内声明(或特别是未在可访问的范围内定义update);检查我们的控制台。
apsillers 2013年

39
幸运的是,balls.splice()带有p
m59 2013年

1
你有错误Uncaught ReferenceError: asplode is not defined。功能asplode()不可见。
AntoJurković2013年

2
asplode不在正确的范围内,setInterval应该接收函数引用,splice需要索引-否则世界就在缩小jsfiddle.net/5f85b
bentytree 2013年

3
这是一个完全不同的问题。他们唯一的共同点是球。和JavaScript。和注意。哦,请,如果你想开玩笑,至少要有品位。(但是无论如何,它们都将被删除。)
BoltClock

Answers:


65

您的代码有一些问题。

首先,在您的定义中:

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之外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得到的返回值即时调用 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)after之后执行p.radius == 0


21
setInterval(shrink(p),100);

这并没有按照您的想法做。这将调用shrink,传递它p,然后将结果传递给setIntervalshrink(p)返回undefined,因此该行实际上不会在间隔上放置任何内容。

您可能想要:

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

1
@tereško:我可以接受:)
Rocket Hazmat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.