Javascript 函数前的左括号

Javascript 函数前的左括号,javascript,html,Javascript,Html,我对Javascript有一些经验,但我想知道为什么在function关键字前面有一个左括号: requestAnimFrame = (function(callback) { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRe

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

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

你能解释一下为什么有两个回调函数吗。还有一件事,为什么在代码的最后一行有一个没有任何内容的括号?

这是一个自调用匿名函数:

(function() {
  // code in here
})();
使用此声明,您可以确保一旦声明该函数,它就会被执行。

您看到的模式(在函数前面使用括号,在末尾使用空对)称为(或IIFE)


它立即运行函数,而不是等待函数被调用。

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

(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
变量中


最后,最后一行的括号不是不匹配的。它是外部功能的闭合支架。返回内部函数的函数。

只是出于好奇,为什么要这样做?在函数中包装它有意义吗?我想你也可以在函数中写几行?我的最佳猜测是可读性,也可能是更好的垃圾收集?我想说,它的主要优点可能是在代码上强制一个作用域。基本上,您将所有代码封装在一个函数中,这使它绑定到该函数的作用域。(即使此函数封装了所有代码)基本上,您是在“强制”自己保持全局上下文干净。可能的
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`)