Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;“未捕获类型”;requestAnimationFrame出错_Javascript_Html_Requestanimationframe - Fatal编程技术网

Javascript &引用;“未捕获类型”;requestAnimationFrame出错

Javascript &引用;“未捕获类型”;requestAnimationFrame出错,javascript,html,requestanimationframe,Javascript,Html,Requestanimationframe,因此,我用requestAnimationFrame编写了一个工作应用程序(实际上是它的一半)。在项目变得太复杂之前,我正急于用面向对象的方式重写它,这样我们可以更好地实现插件(并且在不改变整个应用程序的情况下修复模块)。事实上,该应用程序的第一个版本真的是一团糟,由大量测试代码组成 因此,我有以下几点: Aventura.prototype.update=function(){ var av=这个; requestAnimationFrame(av.update); /*…帧代码*/ };

因此,我用requestAnimationFrame编写了一个工作应用程序(实际上是它的一半)。在项目变得太复杂之前,我正急于用面向对象的方式重写它,这样我们可以更好地实现插件(并且在不改变整个应用程序的情况下修复模块)。事实上,该应用程序的第一个版本真的是一团糟,由大量测试代码组成

因此,我有以下几点:

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方法本身分开?是的,这就是我的意思。