2016-06-26 7 views
0

У меня очень странная проблема с обратным вызовом и requestAnimationFrame. Он выполняется успешно один раз, но второй раз обратный вызов становится номером.Почему typeof callback становится номером?

function TEST() { 
 
    this.michou = "jean"; 
 
} 
 

 
TEST.prototype.talk = function(fn) { 
 
    window.requestAnimationFrame(this.talk.bind(this)); 
 
    alert(typeof fn); //type of callback 
 
    fn(); 
 
}; 
 

 
var jean = new TEST(); 
 

 
jean.talk(function() { 
 
    alert("hello"); 
 
});

Если вы попробуете этот код, вы увидите в «функции» оповещения «привет» и «номер» «номер». Почему «номер» показан для типа callback?

ответ

1

.talk() Когда функция вызываются в кадре анимации, нет fn передаваемого значения (хотя что-того передаются; см. Ниже) Если изменить код, который можно исправить:

TEST.prototype.talk = function(fn) { 
    window.requestAnimationFrame(this.talk.bind(this, fn)); 
    alert(typeof fn); //type of callback 
    fn(); 
}; 

Если вы передаете fn в качестве второго параметра при привязке функции к ссылке на объект, функция будет вызываться как с правильной this значения и в параметр.

Числовое значение, которое видит ваш код, это метка времени высокого разрешения, которую браузер передает в обратный вызов кадра анимации. По-прежнему будет проходить, если код будет изменен, как указано выше, но это будет второй параметр, а не первый.