如何在带参数的函数内部使用 requestAnimationFrame?
How to use requestAnimationFrame inside function with arguments?
我试图为很多 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));
}
使用全局变量效果完美
必须延迟而不是直接调用,例如
requestAnimationFrame(() => dashOffset(selector, dashStart, dashFinish, speed));
您安排了一个调用 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") 以及任意数量的调用参数 pre-filled。
但是,ES6 语法解决方案通常最容易使用,也最适合其他人阅读。
我试图为很多 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));
}
使用全局变量效果完美
必须延迟而不是直接调用,例如
requestAnimationFrame(() => dashOffset(selector, dashStart, dashFinish, speed));
您安排了一个调用 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") 以及任意数量的调用参数 pre-filled。
但是,ES6 语法解决方案通常最容易使用,也最适合其他人阅读。