我对Javascript有一些经验,但我想知道为什么在函数关键字之前有左括号:
requestAnimFrame = (function(callback) {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
你也能解释为什么有2个回调函数。还有一件事,为什么在最后一行代码中没有任何东西的括号?
答案 0 :(得分:2)
这是一个自我调用的匿名函数:
(function() {
// code in here
})();
使用此声明,您可以确保一旦声明该功能,它就会被执行。
答案 1 :(得分: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
变量中。
最后,最后一行的括号不是不匹配的。它是外部功能的结束括号。那个正在回归内功能的人。
答案 2 :(得分:1)
您看到的模式(在函数前使用括号,在结尾使用空对)称为Immediately-invoked function expression(或IIFE)
(function() {
// ....
})();
它立即运行该功能,而不是等待它被调用。