- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要对片段进行排队并在给定时间(每秒一次)执行它们。这些片段实际上是玩家的 Action ,例如 jump()、attack()、walk('left') 等。
当用户按下一个键时,我需要将他的操作排队并每秒执行一次所有操作。
现在我的方法是将每个片段添加到一个数组并使用 eval() 循环遍历它,因为没有更好的主意。这是我的代码:
var queue = [];
// On player or AI action
queue.push('attack()'); // Could be walk('left'), jump() etc.
// On new frame
for(var i=0;i<queue.length;i++){
eval(queue[i]);
}
queue = [];
我确定我的方法很糟糕,但我想澄清我想做什么,我想这样的问题并不少见。有任何信息/想法吗?
最佳答案
它是可怕的——eval
是邪恶的。相反,使用 closures :
var queue = [];
queue.push(function() { attack(); });
while (queue.length) {
queue.shift().call();
}
这是一般情况,但在这种情况下可以简化:function() { attack();
是一种更复杂和更慢的编写 attack
的方法,所以 queue.push(attack)
也可以工作(如果你有一个 function attack() { ... }
定义在可访问的地方)。显然,如果您的函数采用参数(或者更确切地说,如果每个函数采用不同的参数;您可以在 call(thisobj, param)
调用中提供统一的参数列表),则您不能这样做。
编辑您的附加查询:
在您编写的代码中,这应该已将变量捕获到闭包中;如果您更改变量,该值将是您执行它时将获得的值。如果你有 undefined
,我猜你稍后在某处执行了 closerEnemy = undefined
。这是一个常见的错误来源,例如,人们试图将点击处理程序绑定(bind)到循环中的多个元素,并在处理程序中使用循环计数器 - 处理程序捕获计数器而不是它的值,并且总是在以后计算到元素的数量(循环结束时它留下的最后一个值)。
要捕获值而不是变量,请使用这个技巧:
(function(capturedCloserEnemy) {
queue.push(function() {
attack(capturedCloserEnemy);
});
})(closerEnemy);
(变量的命名不同只是为了便于阅读;它们可以全部命名,这无关紧要,因为有阴影。)
关于javascript - 在javascript中排队一个片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13966092/
我的 JavaScript 代码中有一道数学题。我需要将给定数量的玩家随机分成 2 队,这样每次 - 如果玩家想再次比赛 - 团队都会重新组成,并且在形成所有组合之前他们应该不同。 假设我有 4 个玩
我是一名优秀的程序员,十分优秀!