Ralf Bokelberg однажды спросил в конференции FlashCoders: как быстро остановить выполнение кода в Flash Player? Ответов последовало большое множество, но методы Питера Холла [Peter Hall] кажутся наиболее оптимальными:
((a={}).__proto__=a).a;
Применение этого метода приводит к образованию бесконечной цепочки прототипов (она бесконечна, поскольку замкнута в кольцо), и, вследствие того, что Flash Player распознает такие ситуации, выполнение скрипта останавливается и в окне output выдается сообщение:
256 levels of prototype chain were exceeded.
This is probably a circular prototype chain.
Further execution of actions has been disabled in this movie.
То есть: проигрыватель понимает, что цепочка прототипов состоит из более чем 256 уровней, делает предположение, что эта цепочка замкнута, и прекращает выполнение кода в клипе.
Такой метод основан на том же принципе, что и предыдущий — это использование зацикливаний, мгновенно распознаваемых проигрывателем (в отличие от конструкций типа while(true), на определение зациклености которых проигрывателю требуется 15 секунд).
function
f(){f()};
f();
Этот код выводит в окно output:
256 levels of recursion were exceeded in one action list.
This is probably an infinite loop.
Further execution of actions has been disabled in this movie.
То есть: проигрыватель понимает, что образовалось более 256 уровней рекурсии (функция вызывает сама себя), делает предположение, что этот цикл бесконечен, и прекращает выполнение кода в клипе, как и с предыдущем примере.
Может быть, есть лучшие способы? while(true) не предлагать, потому что.