请解释这个请求动画帧成语

please explain this requestAnimationFrame idiom

本文关键字:动画 成语 请求 解释      更新时间:2023-09-26

有很多地方(例如如何使用requestAnimationFrame?)可以修复window.requestAnimationFrame如下。我不明白为什么赋值的右侧被包装在函数调用中。

window.requestAnimFrame = (function(){
    return window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    function(callback){
        window.setTimeout(callback, 1000 / 60);
    };
})();

我以前也想知道同样的事情。我很确定谷歌真的很喜欢关闭。当然,那里没有一个变量,这是一件"安全"的事情。

据我所知,这是完全相同的事情,没有改变对命名空间的干扰(使用这样的闭包的一般原因):

window.requestAnimFrame = 
    window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    function(callback){
        window.setTimeout(callback, 1000 / 60);
    };

在 OP 示例中,将代码放入闭包中没有任何作用(至少我知道的是:-)

http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating 这里查找类似的函数,对局部变量执行相同的操作。在这种情况下,如果变量不在闭包内,它将全局结束。

所以涉及两件事:

  • 嵌入变量的函数,使它们不会成为全局变量
  • 立即执行此函数以运行代码。

这里的即时函数JavaScript是关于这些直接函数的另一个讨论。

万事如意,诺比

requestAnimationFrame需要一个参数:要运行的函数。但是,setTimeout需要运行函数以及运行它的延迟。因此,虽然您可以直接分配各个函数,但您必须为 setTimeout 创建一个闭包,以便您可以分配第二个参数。

这基本上是一种咖喱形式。