Я вижу фундаментальное недопонимание того, что здесь происходит. Например, в вашей первой декларации:
var requestAnimationFrame = ( function() {
return window.requestAnimationFrame || //Chromium
window.webkitRequestAnimationFrame || //Webkit
window.mozRequestAnimationFrame || //Mozilla Geko
window.oRequestAnimationFrame || //Opera Presto
window.msRequestAnimationFrame || //IE Trident?
function(callback) { //Fallback function
window.setTimeout(callback, 1000/60);
}
})();
Вы создаете анонимную функцию, затем немедленно вызываете ее и присваиваете результат переменной. Я не вижу в этом смысла. Следующее будет работать одинаково хорошо:
var requestAnimationFrame =
window.requestAnimationFrame || //Chromium
window.webkitRequestAnimationFrame || //Webkit
window.mozRequestAnimationFrame || //Mozilla Geko
window.oRequestAnimationFrame || //Opera Presto
window.msRequestAnimationFrame || //IE Trident?
function(callback) { //Fallback function
window.setTimeout(callback, 1000/60);
};
Теперь нет анонимной функции (ну, кроме маленькой резервной функции), это просто код, который выполняется. Вы можете применить аналогичное упрощение к вашей функции step()
.