[英]Javascript game loop state in an anonymous function
我正在搞乱画布,首先阅读一堆游戏循环片段/帖子并将它们组合成最好的一个。
今天我发现了这个片段(这是一篇文章的部分内容,所以他们稍后会对它进行进一步的迭代。但是我正在整合这些想法),但这让我感到困惑。
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
,它在外部函数中定义...
那么这个游戏会在外部匿名功能中保持其状态吗? 如果是这样,任何想法为什么他们这样做?
至于eg loops
,每次调用都设置为0,它是否在外面声明,以避免每次重新声明变量?
这种类型的构造称为立即调用的函数表达式或IIFE 。
此模式用于管理范围。 在这种情况下,我们阻止loops
和skipTicks
等变量泄漏到全局范围。 更重要的是,它们在内部函数的闭包中被捕获,因此在对内部函数的调用中持续存在。 通过使用IIFE,只有我们的内部函数可以看到这种状态,并且它在全局上下文中是隐藏的。
这是关于模式的一篇不错的文章 。 请特别参阅有关使用闭包保存状态的部分。
是的,它会的。
在local frame
你返回的功能是内部local frame
的Game.run功能。 因此,围绕您返回的函数在Game.run中更改的任何变量都是持久的。 只要您尝试引用nextTick变量,该函数的父框架就会在Game.run中查找。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.