Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   программная анимация (https://javascript.ru/forum/misc/23608-programmnaya-animaciya.html)

taha 29.11.2011 20:54

программная анимация
 
Сегодня утром наткнулся на данную статью Основы программной анимации на JavaScript

и вроде всё в порядке... даже реализовал анимацию, движение по спирали, пока в голову не начали лезть сомнения.. Всё-таки для человека долгое время развлекающегося асемблером и далекого от web-технологий всё это как то странно.. просто хочу уточнить пару моментов..

Допустим есть что-то похожее на:

function go(arg1,arg2){
  var radius = arg1;
  var obj = arg2; /* элемент который вращаем*/
  ...
  setTimeout(function() {
      /* Используем radius и obj*/
      /* Тут изменение параметров */
      if (/* условие срабатывания итерации */)
          setTimeout(arguments.callee, 0);
   }, 0);
}


Не могу до конца понять.. Смотрите..
мы запускаем go(MyElement1, Rad);
проинициализировались переменные
setTimeout запускает анонимную функцию и гоняет её по циклу, пользуясь переменными go(), пока не сделает все свои дела...

вопрос встал вот в чем: пока setTimeout гоняет свою функцию, она пользуется переменными go() и тут я могу понять замыкание и тд.. НО! А если я пользуюсь этой функцией не для одного элемента, а для нескольких??? Разве переменные radius и obj не должны перетераться???? и на этом месте у меня в голове заварилась каша :)

melky 29.11.2011 20:57

они каждый раз будут заново создаваться и каждый раз будет появляться замыкание. вроде бы :)

taha 29.11.2011 21:06

я пока для себя могу найти только одно разумное объяснение...
что когда идет обращение к go() второй/.../n-й раз интерпритатор будет видеть, что [[scope]] функции go, ныне принадлежащий анонимной функции, пока еще занят и будет создавать новый [[scope]], а старый остаётся за анонимной функцией до её смерти... Логично?? или я не прав...

taha 29.11.2011 21:25

Цитата:

Сообщение от Главная » Основные элементы языка » Замыкания
При запуске функции все происходит стандартно:

создается [[scope]]
туда записываются локальные переменные
внутренняя функция получает ссылку на [[scope]]

Но в самом конце - внутренняя функция присваивается sourceNode.onclick. Внешняя функция закончила свою работу, но внутренняя - может запуститься когда-нибудь потом.

Интерпретатор javascript не проводит анализ - понадобятся ли внутренней функции переменные из внешней, и какие переменные могут быть нужны.

Вместо этого он просто оставляет весь [[scope]] внешней функции в живых.

Чтобы когда внутренняя функция запустится, если она вдруг не найдет какую-либо переменную в своем [[scope]] - она могла обратиться к [[scope]] внешней функции и нашла бы ее там.

Когда внешняя функция будет вызываться повторно, но с другими аргументами, а [[scope]] будет еще занят внутреней функцией с предыдущего вызова, интерпритатор для этой внешней функции создаст [[scope]] ещё раз?????

trikadin 29.11.2011 21:51

Каждому вызову - по отдельному [скопу]) melky всё правильно сказал...

Кстати, на будущее: если нужно анимировать два разных объекта одновременно, то лучше пользоваться одним таймером, который будет менять св-ва обоих.

taha 29.11.2011 22:21

спасибо за ответы

trikadin, в моем случае согласен... а если я не знаю сколько их будет? допустим два от одного родителя и 6 от другого с разными радиусом и скоростью например... страшная же функция получится)))) я хотел найти наиболее простое решение для себя, чтоб использовать как $(...).animate({...});

trikadin 29.11.2011 22:25

А если 100500 и все с разной анимацией разных css-св-в?)

Анимацию на javascript надо оптимизировать для каждого отдельного случая, иначе тормозно будет.

melky 29.11.2011 23:28

лучше тогда использовать transitions ...

ёмаё, ну для кого их придумывали? в каждой теме про них говорю, толку никакого :)

trikadin 29.11.2011 23:34

melky, в каждой теме говорят, что использовать document.write и ставить обработчик на кнопку, а не на отправку формы - плохо. Никакого толку)

melky 29.11.2011 23:38

обработчик ещё через свойство и через атрибут ставить :) где-то тут было.


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