请解释一下这个requestAnimationFrame的成语

时间:2012-04-19 22:01:53

标签: javascript html5

有很多地方(例如How to use requestAnimationFrame?)修复了window.requestAnimationFrame,如下所示。我不明白为什么赋值的右侧包含在函数调用中。

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

3 个答案:

答案 0 :(得分:0)

我以前也想过同样的事情。我非常确定谷歌真的很喜欢闭包。当然,那里没有一个变量,它是一个安全的'要做的事。

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

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

答案 1 :(得分:0)

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

在这里http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating查看类似的函数与局部变量做同样的事情。在这种情况下,如果变量不在闭包内,变量将全局结束。

所以涉及到两件事:

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

此处Immediate functions JavaScript是关于这些即时功能的另一个讨论。

一切顺利,nobi

答案 2 :(得分:-2)

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

它基本上是currying的一种形式。