为什么typeof回调成为数字?

时间:2016-06-26 15:49:02

标签: javascript callback numbers typeof requestanimationframe

回调和requestAnimationFrame我有一个非常奇怪的问题。它成功执行一次,但第二次回调变为Number。

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");
});

如果您尝试此代码,您将在警报“function”“hello”和“number”“number”中看到。为什么callback的类型显示“数字”?

1 个答案:

答案 0 :(得分:1)

在动画帧中调用.talk()函数时,没有传递fn值(虽然传递了某些;见下文)。如果您更改了代码,则可以修复:

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

如果在将函数绑定到对象引用时将fn作为第二个参数传递,则将使用正确的this参数调用该函数

代码看到的数字值是浏览器传递给动画帧回调的高分辨率时间戳。如果代码如上所述更改,它仍会传递,但它将是第二个参数,而不是第一个参数。