如何在 AlpineJS 中递归调用方法?

How do I call a method recursively in AlpineJS?

import 'alpinejs'

window.scrollToTop = () => {
    return {
        scroll() {
            const t = document.documentElement.scrollTop || document.body.scrollTop
            if ( t > 0 ) {
                window.requestAnimationFrame( this.scroll )
                window.scrollTo( 0, t - t / 10 )
            }
        }
    }
}

我正在使用以下代码来执行简单的滚动到顶部动画。

使用 window.scrollToTop 因为我正在使用 ParcelJS 来捆绑项目所以我必须将它附加到 window 对象。

当我尝试 运行 滚动功能时出现此错误。

app.js:8 Uncaught TypeError: Cannot read property 'scroll' of undefined

我在滚动点击上做了一个console.log,似乎在方法中识别了this.scroll。但是当调用 window.requestAnimationFrame 时它变成了 undefined?我尝试将它作为变量传递,但它也不起作用。在这种情况下,如何使用 requestAnimationFrame 递归调用自身?

Javascript 在处理范围时有点复杂。 在第一个回调中 this 恢复为 window 因此您需要在递归使用这些函数时手动绑定它。

window.requestAnimationFrame(this.scroll.bind(this)) 应该有效