Javascript &引用;“未捕获类型”;requestAnimationFrame出错
因此,我用requestAnimationFrame编写了一个工作应用程序(实际上是它的一半)。在项目变得太复杂之前,我正急于用面向对象的方式重写它,这样我们可以更好地实现插件(并且在不改变整个应用程序的情况下修复模块)。事实上,该应用程序的第一个版本真的是一团糟,由大量测试代码组成 因此,我有以下几点:Javascript &引用;“未捕获类型”;requestAnimationFrame出错,javascript,html,requestanimationframe,Javascript,Html,Requestanimationframe,因此,我用requestAnimationFrame编写了一个工作应用程序(实际上是它的一半)。在项目变得太复杂之前,我正急于用面向对象的方式重写它,这样我们可以更好地实现插件(并且在不改变整个应用程序的情况下修复模块)。事实上,该应用程序的第一个版本真的是一团糟,由大量测试代码组成 因此,我有以下几点: Aventura.prototype.update=function(){ var av=这个; requestAnimationFrame(av.update); /*…帧代码*/ };
Aventura.prototype.update=function(){
var av=这个;
requestAnimationFrame(av.update);
/*…帧代码*/
};
我在控制台日志中的requestAnimationFrame行中得到了“UncaughtTypeError:TypeError”。我知道我的浏览器有一个合适的requestAnimationFrame实现,因为我很好地使用了我应用程序的混乱版本
我得出的结论是,它引发了一个异常,因为我调用的方法是调用方自己的父对象的成员(我知道这是完全相同的方法,但问题显然不在于自调用,因为RAF应该这样做)。有什么不对劲的线索吗?我在这里找到了另一个问题的答案。但我不认为这是一个重复的问题,因为这两个问题都是以不同的方式提出的,有人可以找到一个问题,但找不到另一个问题(我自己在网上到处寻找类似的问题,从来没有遇到过这个潜在的重复问题)
我在这里找到了另一个问题的答案。但我不认为这是一个重复的问题,因为这两个问题都是以不同的方式提出的,有人可以找到一个问题,但找不到另一个问题(我自己在网上到处寻找类似的问题,从来没有遇到过这个潜在的重复问题)
这与
requestAnimationFrame
无关。这是一个基本的JavaScript问题,与传递函数以及此
的含义有关
人们倾向于认为对象中的函数值属性,如下面的myFn
var myObj = {
myFn: function() {console.log(this);}
};
不知何故,myObj已作为此被“烘焙”。错<代码>此仅在调用函数时分配。如果我说myObj.myFn()
当将函数作为参数传递给setTimeout
、promises或requestAnimationFrame
时,这一点非常重要。只传递myObj.myFn
传递函数,但它没有关联的this
requestAnimationFrame
不知道这个函数从哪里来,也不知道用什么来调用它,所以它用一个窗口的this
,或者null
,或者0,或者未定义的,或者谁知道是什么。这会导致错误
解决这个问题最简单的方法就是
requestAnimationFrame(function() {av.update(); });
现在,使用正确的this
调用update
一种更为复杂、等效的方法是
requestAnimationFrame(av.update.bind(av));
其他注释
我认为将函数本身传递给requestAnimationFrame
的方式不会很好地工作。实际上,您正在设置一系列递归调用,最终堆栈将溢出。您需要将要在requestAnimationFrame
回调上执行的逻辑与请求帧的逻辑分开。这与requestAnimationFrame
无关。这是一个基本的JavaScript问题,与传递函数以及此
的含义有关
人们倾向于认为对象中的函数值属性,如下面的myFn
var myObj = {
myFn: function() {console.log(this);}
};
不知何故,myObj已作为此
被“烘焙”。错<代码>此
仅在调用函数时分配。如果我说myObj.myFn()
当将函数作为参数传递给setTimeout
、promises或requestAnimationFrame
时,这一点非常重要。只传递myObj.myFn
传递函数,但它没有关联的this
requestAnimationFrame
不知道这个函数从哪里来,也不知道用什么来调用它,所以它用一个窗口的this
,或者null
,或者0,或者未定义的,或者谁知道是什么。这会导致错误
解决这个问题最简单的方法就是
requestAnimationFrame(function() {av.update(); });
现在,使用正确的this
调用update
一种更为复杂、等效的方法是
requestAnimationFrame(av.update.bind(av));
其他注释
我认为将函数本身传递给requestAnimationFrame
的方式不会很好地工作。实际上,您正在设置一系列递归调用,最终堆栈将溢出。您需要将要在requestAnimationFrame
回调上执行的逻辑与请求帧的逻辑分开。您的意思是requestAnimationFrame调用方法应该与update方法本身分开吗?是,这就是我的意思。你是说requestAnimationFrame调用方法应该与update方法本身分开?是的,这就是我的意思。