Javascript 设置超时动画不工作

Javascript 设置超时动画不工作,javascript,Javascript,我正在尝试将一个正方形淡入画布元素。当我在动画中使用setInterval时,一切正常,但如果我尝试使用setTimeout,一切都会崩溃。这是我的密码: 问题可能在于drawFrame中的this关键字。当启动setTimeout时,此in侧不再是rect 解决方案是使用或。 f.apply(self)将函数f中的this关键字绑定到第一个参数f 因此,改变这种方式: rectangle.prototype.drawFrame = function draw(){ var self =

我正在尝试将一个正方形淡入画布元素。当我在动画中使用setInterval时,一切正常,但如果我尝试使用setTimeout,一切都会崩溃。这是我的密码:


问题可能在于
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,停止调用
    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不可用,则有用)
          • 与重新赋值相比,更喜欢命名函数表达式。它减少了闭包开销(如果动画持续时间足够长,则不会忽略此开销)。更简洁的代码是额外的

            • 问题可能在于
              绘图框中的
              这个
              关键字。当启动
              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{
              而不是
              设置超时
              ,使用
              请求动画帧
              (正如您已经“填充”了)来更好地