Javascript 设置超时动画不工作
我正在尝试将一个正方形淡入画布元素。当我在动画中使用setInterval时,一切正常,但如果我尝试使用setTimeout,一切都会崩溃。这是我的密码:Javascript 设置超时动画不工作,javascript,Javascript,我正在尝试将一个正方形淡入画布元素。当我在动画中使用setInterval时,一切正常,但如果我尝试使用setTimeout,一切都会崩溃。这是我的密码: 问题可能在于drawFrame中的this关键字。当启动setTimeout时,此in侧不再是rect 解决方案是使用或。 f.apply(self)将函数f中的this关键字绑定到第一个参数f 因此,改变这种方式: rectangle.prototype.drawFrame = function draw(){ var self =
问题可能在于
drawFrame
中的this
关键字。当启动setTimeout
时,此
in侧不再是rect
解决方案是使用或。
f.apply(self)
将函数f
中的this
关键字绑定到第一个参数f
因此,改变这种方式:
rectangle.prototype.drawFrame = function draw(){
var self = this;
this.opacity += 0.005;
this.renderSelf();
if (this.opacity < 1) {
requestAnimationFrame(function(){
draw.call(self)
});
}
};
rectangle.prototype.drawFrame=函数draw(){
var self=这个;
这是不透明度+=0.005;
这个。renderSelf();
如果(此不透明度<1){
requestAnimationFrame(函数(){
抽签。呼叫(自我)
});
}
};
看看这个JSBin
========================
根据有效注释编辑:
- 原始代码中的
不是语义性的,并且遗漏了x
声明。固定的var
- 首选
而不是requestAnimationFrame
setTimeout
- 如果不透明度>=1,停止调用
(如果requestAnimationFrame不可用,则有用)drawFrame
- 与重新赋值相比,更喜欢命名函数表达式。它减少了闭包开销(如果动画持续时间足够长,则不会忽略此开销)。更简洁的代码是额外的
- 问题可能在于
绘图框中的这个关键字。当启动setTimeout
时,此
in侧不再是rect
解决方案是使用或。
f.apply(self)
将函数f
中的this
关键字绑定到第一个参数f
因此,改变这种方式:
rectangle.prototype.drawFrame = function draw(){
var self = this;
this.opacity += 0.005;
this.renderSelf();
if (this.opacity < 1) {
requestAnimationFrame(function(){
draw.call(self)
});
}
};
rectangle.prototype.drawFrame=函数draw(){
var self=这个;
这是不透明度+=0.005;
这个。renderSelf();
如果(此不透明度<1){
requestAnimationFrame(函数(){
抽签。呼叫(自我)
});
}
};
看看这个JSBin
========================
根据有效注释编辑:
- 原始代码中的
x
不是语义性的,并且遗漏了var
声明。固定的
- 首选
requestAnimationFrame
而不是setTimeout
- 如果不透明度>=1,停止调用
drawFrame
(如果requestAnimationFrame不可用,则有用)
- 与重新赋值相比,更喜欢命名函数表达式。它减少了闭包开销(如果动画持续时间足够长,则不会忽略此开销)。更简洁的代码是额外的
问题可能在于
绘图框中的这个关键字。当启动setTimeout
时,此
in侧不再是rect
解决方案是使用或。
f.apply(self)
将函数f
中的this
关键字绑定到第一个参数f
因此,改变这种方式:
rectangle.prototype.drawFrame = function draw(){
var self = this;
this.opacity += 0.005;
this.renderSelf();
if (this.opacity < 1) {
requestAnimationFrame(function(){
draw.call(self)
});
}
};
rectangle.prototype.drawFrame=函数draw(){
var self=这个;
这是不透明度+=0.005;
这个。renderSelf();
如果(此不透明度<1){
requestAnimationFrame(函数(){
抽签。呼叫(自我)
});
}
};
看看这个JSBin
========================
根据有效注释编辑:
- 原始代码中的
x
不是语义性的,并且遗漏了var
声明。固定的
- 首选
requestAnimationFrame
而不是setTimeout
- 如果不透明度>=1,停止调用
drawFrame
(如果requestAnimationFrame不可用,则有用)
- 与重新赋值相比,更喜欢命名函数表达式。它减少了闭包开销(如果动画持续时间足够长,则不会忽略此开销)。更简洁的代码是额外的
问题可能在于
绘图框中的这个关键字。当启动setTimeout
时,此
in侧不再是rect
解决方案是使用或。
f.apply(self)
将函数f
中的this
关键字绑定到第一个参数f
因此,改变这种方式:
rectangle.prototype.drawFrame = function draw(){
var self = this;
this.opacity += 0.005;
this.renderSelf();
if (this.opacity < 1) {
requestAnimationFrame(function(){
draw.call(self)
});
}
};
rectangle.prototype.drawFrame=函数draw(){
var self=这个;
这是不透明度+=0.005;
这个。renderSelf();
如果(此不透明度<1){
requestAnimationFrame(函数(){
抽签。呼叫(自我)
});
}
};
看看这个JSBin
========================
根据有效注释编辑:
- 原始代码中的
x
不是语义性的,并且遗漏了var
声明。固定的
- 首选
requestAnimationFrame
而不是setTimeout
- 如果不透明度>=1,停止调用
drawFrame
(如果requestAnimationFrame不可用,则有用)
- 与重新赋值相比,更喜欢命名函数表达式。它减少了闭包开销(如果动画持续时间足够长,则不会忽略此开销)。更简洁的代码是额外的
不要使用设置超时
,而是使用requestAnimationFrame
(因为您已经“填充”了)来更好地匹配浏览器的重画周期。requestAnimationFrame也不起作用:(另外:你的x
是一个全局变量…不好。与其创建两个匿名函数,不如命名第一个,然后使用它。rectangle.prototype.drawFrame=function()将你的名字放在这里\u drawFrame{
而不是setTimeout
,使用requestAnimationFrame
(正如你已经“填充”过的那样)为了更好地匹配浏览器的重画周期,requestAnimationFrame也不起作用:(另外:你的x
是一个全局变量…不好。与其创建两个匿名函数,不如命名第一个,然后使用它。rectangle.prototype.drawFrame=function()将你的名字放在这里\u drawFrame{
而不是设置超时
,使用请求动画帧
(正如您已经“填充”了)来更好地