Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите пожалуйста, немогу понять этот пример (https://javascript.ru/forum/misc/72414-pomogite-pozhalujjsta-nemogu-ponyat-ehtot-primer.html)

IAmTrying 26.01.2018 23:17

Помогите пожалуйста, немогу понять этот пример
 
var cat = document.querySelector("img");
var angle = 0, lastTime = null;
function animate(time) {
if (lastTime != null)
angle += (time - lastTime) * 0.001;
lastTime = time;
cat.style.top = (Math.sin(angle) * 20) + "px";
cat.style.left = (Math.cos(angle) * 200) + "px";
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);


Объясните пожалуйста, как эта функция работает lastTime = null, а потом условие if (lastTime != null) как запускается тело после if? Зачем мы передаем в функцию переменную если потом не задаем здесь requestAnimationFrame(animate) ? Почему не объявить ее внутри?
angle += (time - lastTime) * 0.001 как это работает? Незаданная переменная time(которая просто объявлена), и lastTime = null, как оно переходит с null в какое-то значение, я вижу что идет присвоение lastTime = time; но переменной time не присваивается значение нигде, сложна сложна слооожна:blink: :blink: :blink:

Aetae 26.01.2018 23:49

animate - это коллбэк, функция которая не вызывается прямо сейчас, а передаётся в качестве параметра в другую функцию(в данном случае requestAnimationFrame), коея уже в свою очередь внутри себя её вызывает с тем или иным набором параметров(в данном случае с параметром time, содержащим метку времени на момент вызова).

lastTime обявлена выше по скоупу(var angle = 0, lastTime = null;) потому доступна для изменения как внутри функции, так и снаружи. Значение null она имеет только первый раз, потом же происходит присовение текущей метки (lastTime = time;) и в последующих вызовах animate она имеет то значение, что и описывается её названием.

angle += (time - lastTime) * 0.001: угол равен время текущего вызова функции animate минус время предыдущего умножить на 0.001.
Фактически это значит, что независимо от частоты кадров угол изменится ровно на 0.001 за каждую прошедшую милисекнуду.

IAmTrying 27.01.2018 12:52

Спасибо за ответ:dance:


Часовой пояс GMT +3, время: 01:22.