http://jsfiddle.net/goldrunt/jGL84/42/ это из строки 84 в этой скрипке JS. Есть 3 различных эффекта, которые можно применить к шарам, раскомментировав строки 141-146. Эффект «подпрыгивания» работает как следует, но эффект «вытоптания» ничего не делает. Должен ли я включить функцию «сжатия» внутри функции 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);
}
}
javascript
html
MATTO
источник
источник
asplode
не объявлен в глобальной области (или, в частности, не определен в области, доступной дляupdate
); проверьте нашу консоль.balls.splice()
сp
.Uncaught ReferenceError: asplode is not defined
. Функцияasplode()
не видна.asplode
не в нужной области видимости,setInterval
должен получить ссылку на функцию,splice
нуждается в индексе - или, возможно, мир просто сокращается с вами jsfiddle.net/5f85bОтветы:
У вашего кода есть несколько проблем.
Во-первых, в вашем определении:
asplode
является локальным для области видимости внутриshrink
и поэтому недоступен для кода, вupdate
котором вы пытаетесь вызвать его. Область видимости JavaScript основана на функциях, поэтомуupdate
не может видеть,asplode
потому что она не внутриshrink
. ( В вашей консоли вы увидите ошибку вроде:.Uncaught ReferenceError: asplode is not defined
)Вместо этого вы можете сначала попробовать выйти
asplode
за пределыshrink
:Однако у вашего кода есть еще несколько проблем, которые выходят за рамки этого вопроса:
setInterval
ожидает функцию.setInterval(shrink(p), 100)
вызывает ,setInterval
чтобы получить возвращаемое значение из немедленного вызоваshrink(p)
. Вы, вероятно, хотитеВаш код,
for (var i = 0; i < 100; i++) { p.radius -= 1; }
вероятно, не делает то, что вы думаете, что он делает. Это немедленно запустит операцию декремента 100 раз, а затем визуально покажет результат. Если вы хотите рендерить шар с каждым новым размером, вам нужно будет выполнять каждый отдельный декремент в отдельном обратном вызове времени (например,setInterval
операция)..splice
ожидает числовой индекс, а не объект. Вы можете получить числовой индекс объекта с помощьюindexOf
:К тому времени, когда ваш интервал запускается в первый раз,
balls.splice
оператор уже произошел (точнее, это произошло около 100 мс назад). Я предполагаю, что это не то, что вы хотите. Вместо этого у вас должна быть убывающая функция, которая неоднократно вызываетсяsetInterval
и, наконец, выполняетсяballs.splice(p,1)
послеp.radius == 0
.источник
Это не делает то, что вы думаете, что делает. Это вызывает
shrink
, передает егоp
, а затем передает результатsetInterval
.shrink(p)
возвращаетundefined
, так что эта строка на самом деле ничего не помещает в интервал.Вы, вероятно, хотите:
источник