开发者问题收集

如何在带有参数的函数内部使用 requestAnimationFrame?

2018-03-24
139

我尝试为许多 svg 路径制作动画,但功能不起作用

错误:

Uncaught RangeError: Maximum call stack size exceeded

 function dashOffset(selector, dashStart, dashFinish, speed) {
    if (offsetStart >= offsetFinish){
        selector.style.strokeDashoffset = offsetStart;
        offsetStart -= speed;
    } else{
        return
    }
    requestAnimationFrame(dashOffset(selector, dashStart, dashFinish, speed));
}

使用全局变量,它可以完美运行

2个回答

您安排了一个调用 dashOffset 的函数,但您并没有调用 dashOffset 本身:

function dashOffset(selector, dashStart, dashFinish, speed) {
  // ...
  requestAnimationFrame(function() {
    dashOffset(selector, dashStart, dashFinish, speed);
  });
}

或者使用 ES6 语法,

function dashOffset(selector, dashStart, dashFinish, speed) {
  // ...
  requestAnimationFrame(() => dashOffset(selector, dashStart, dashFinish, speed));
}

或者,如果您的参数永远不会改变,您可以明确地预绑定所有值:

function processOffset(selector, dashStart, dashFinish, speed) {
  // ...no request here...
}

// and in some other part of your code (probably inside wherever
// you have the actual argument instantiation available:
var runOffset = processOffset.bind(this, selector, dashStart, dashFinish, speed);
requestAnimationFrame(runOffset);

这里 bind() 产生一个新函数,它具有运行上下文(“this”)以及预先填充的任意数量的调用参数。

不过,ES6 语法解决方案通常最容易使用,并且对其他人来说也最容易阅读。

Mike 'Pomax' Kamermans
2018-03-24

必须推迟执行,而不是直接调用,例如

requestAnimationFrame(() => dashOffset(selector, dashStart, dashFinish, speed));
brunnerh
2018-03-24