我正在搞乱画布,首先阅读一堆游戏循环片段/帖子并将它们组合成最好的一个。
我今天遇到了这个片段(它是a post的一部分,所以他们稍后会对它进行进一步的迭代。但是我正在整合这些想法),但这让我感到困惑。
Game.run = (
function() {
var loops = 0;
var skipTicks = 1000 / Game.fps;
var maxFrameSkip = 10;
var nextGameTick = (new Date).getTime();
return function {
loops = 0;
while ((new Date).getTime() > nextGameTick && loops < maxFrameSkip) {
Game.update();
nextGameTick += skipTicks;
loops++;
}
Game.draw();
};
}
)();
Game._intervalId = setInterval(Game.run, 1000 / Game.fps);
因此Game.run
被赋予外部函数的结果,这是内部函数。但是内部函数依赖于nextGameTick
,它在外部函数中定义...
这个游戏会保持其在外部匿名功能中的状态吗?如果是这样,任何想法为什么他们这样做?
至于例如loops
,每次调用都设置为0,是否在外部声明,以避免每次重新声明变量?
答案 0 :(得分:2)
这种类型的构造称为立即调用的函数表达式或 IIFE 。
此模式用于管理范围。在这种情况下,我们阻止loops
和skipTicks
等变量泄漏到全局范围。更重要的是,它们在内部函数的闭包中被捕获,因此在对内部函数的调用中持续存在。通过使用IIFE,只有我们的内部函数可以看到这种状态,并且它在全局环境中是隐藏的。
这是模式上的decent article。请特别参阅有关使用闭包保存状态的部分。
答案 1 :(得分:1)
是的。
您返回的函数的local frame
位于Game.run函数的local frame
内。因此,围绕您返回的函数在Game.run中更改的任何变量都是持久的。只要您尝试引用nextTick变量,该函数的父框架就会在Game.run中查找。