我在requestAnimationFrame shim层上查看Paul Irish的以下代码。我想用另一种语言生成这个js,所以我想把事情弄清楚。(您可以在此处看到它在动画中的使用)。
window.requestAnimFrame = (function(){ //1
return window.requestAnimationFrame || //2
window.webkitRequestAnimationFrame || //3
window.mozRequestAnimationFrame || //4
function( callback ){ //5
window.setTimeout(callback, 1000 / 60); //6
}; //7
})(); //8
//9
(function animloop(){ //10
requestAnimFrame(animloop); //11
render(); //12
})(); //13
我的问题是-第2-4行发生了什么?我们似乎正在获取函数句柄,将它们一起进行OR运算-然后将OR
运算结果分配给第1行中的匿名函数-然后将其分配给var window.requestAnimFrame
。
编辑:感谢所有有用的答案-我只想确保我有正确的答案-以下是对所发生情况的准确表示吗?(这是原始版本)(这是带有更明确代码的版本。)
var myfunc = function() {
if (typeof(window.requestAnimationFrame) != "undefined") {
return window.requestAnimationFrame;
} else if (typeof(window.webkitRequestAnimationFrame) != "undefined") {
return window.webkitRequestAnimationFrame;
} else if (typeof(window.mozRequestAnimationFrame) != "undefined") {
return window.mozRequestAnimationFrame;
} else {
return function(callback) {
window.setTimeout(callback, 1000 / 60);
};
}
};
window.requestAnimFrame = myfunc;
JavaScript逻辑或(不是二进制或)将使用“真实”值-考虑例如
window.foo = window.foo || function() {};
在这种情况下,因为window.foo不存在,所以我们将返回第二个opearnd,如果存在-则OR表达式的值将为第一个操作数。空值或未定义的值是“ falsey”-尽管还有其他falsey值-Google找出它们是什么。
您可以这样阅读:
将属性requestAnimFrame分配给调用自身的函数的输出。这是一个奇怪的概念,但由于JavaScript的作用域规则而通常采用该概念,它可以防止函数内部的任何变量泄漏到全局范围内。这里要注意的重要一点是在第7行,最后的()调用从第1行开始的函数表达式。
该函数返回window.requestAnimationFrame或window.webkitRequestAnimationFrame或window.mozRequestAnimationFrame,或者最后返回(如果不存在(因此为false)),该函数将请求动画帧实现为超时-这就是垫片。
最后,您获得了指向函数的requestAnimFrame,它要么是已经存在的带有标准名称的内置函数,要么是供应商前缀名称或shim函数。
HTH。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句