为什么typeof回调变成数字?

Why typeof callback become number?

我有一个关于回调和 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 的类型显示 "number"?

当您的 .talk() 函数在动画帧中被调用时,没有传递 fn 值(尽管传递了 something ;见下文)。如果您更改代码,您可以解决该问题:

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

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

您的代码看到的数字值是浏览器传递给动画帧回调的高分辨率时间戳。代码改成上面还是pass,但是是第二个参数,不是第一个。