-4

我对 Javascript 有一些经验,但我想知道为什么在 function 关键字之前有一个左括号:

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

您还可以解释为什么有 2 个回调函数。还有一件事,为什么最后一行代码有一个没有任何东西的括号?

4

3 回答 3

2

This is a self-invoking anonymous function:

(function() {
  // code in here
})();

Using this declaration, you can make sure that as soon as you declare that function it will be executed.

于 2013-09-26T14:35:11.370 回答
2

函数定义之前有一个左括号,因为整个函数都被包裹在括号中,以便可以立即调用它。注意这个结构:

(function () {})();

这定义了一个(空)函数,然后通过应用第二组括号立即执行该函数。

没有两个回调函数。这个函数的目的似乎是返回另一个函数。了解在 JavaScript 中,函数是一个对象。它可以像任何其他变量一样传递。这是寻找这样一个变量并返回它。

这基本上可以读作:

If `window.requestAnimationFrame` exists, return it.
Else, if `window.webkitRequestAnimationFrame` exists, return it.
Else, if ... and so on
Else, if none of them exist, return this custom function (the one that calls `setTimeout`)

然后将它返回的任何函数存储在requestAnimFrame变量中。

最后,最后一行的括号不是不匹配的。它是外部函数的右括号。返回内部函数的那个​​。

于 2013-09-26T14:36:43.750 回答
1

The pattern you're seeing (using a parentheses before the function and an empty pair at the end) is called an Immediately-invoked function expression (or IIFE)

(function() {
  // ....
})();

It runs the function right away, instead of waiting for it to be called.

于 2013-09-26T14:35:25.690 回答