Ответ 1
Внимание! Этот вопрос касается не лучшего способа прокладки requestAnimFrame
. Если вы ищете это, перейдите к любому другому ответу на этой странице.
Вас обманули автоматической вставкой с запятой. Попробуйте следующее:
window.requestAnimFrame = function(){
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
}
);
}();
javascript автоматически помещает точку с запятой в ваш оператор return
. Он делает это, потому что за ним следует новая строка, а следующая строка является допустимым выражением. Фактически он переводится на:
return;
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
};
Этот код возвращает undefined
и никогда не выполняет код, стоящий за оператором return. Итак, window.requestAnimFrame
- undefined
. Когда вы вызываете его в animloop
, javascript создает ошибку и останавливает выполнение. Вы можете решить проблему, заключая выражение в круглые скобки.
Могу ли я рекомендовать инструменты разработчика Chrome или firebug для проверки выполнения javascript. С помощью этих инструментов вы бы увидели ошибку. Вы должны отладить его следующим образом (я предполагаю Chrome):
- Выполнить код (он дает неожиданные результаты)
- Откройте инструменты разработчика (щелкните правой кнопкой мыши → Проверить элемент) Вы увидите красный x в строке состояния справа (это означает, что в выполнении есть ошибка).
- Откройте вкладку консоли
- Вы увидите
Uncaught TypeError: свойство 'requestAnimFrame' объекта [object DOMWindow] не является функцией
- Введите консоль:
window.requestAnimFrame
и нажмите enter, вы увидите, что онаundefined
. К настоящему времени вы знаете, что проблема на самом деле не связана сrequestAnimationFrame
и что вы должны сосредоточиться на первой части вашего кода. - Теперь это вопрос сужения кода до того момента, когда он что-то возвращает. Это сложная часть, и если вы все еще не найдете ее в этот момент, вы можете обратиться за помощью в Интернет для получения дополнительной помощи.
Кроме того, смотрите это видео для некоторых хороших практик при написании javascript, он также упоминает о введении автоматической автоматической точки с запятой.