我正在尝试传递“动态”(按键事件频繁更改数据)d_a result-> 1 -1
d_b result-> 1 9
和body
。
我正在调用这样的函数:
direction
问题是snakeGame.createInterval(snakeGame.move, grid, body, direction, interval);
createInterval: function(f, grid, body, direction, interval) {
setInterval(function() { f(grid, body, direction); }, interval);
},
和body
在调用函数时始终保持相同的数据。
假设direction
在第一次调用时出现direction
,在第二次出现之前,'right'
已更改为direction
,但此函数仍将其视为旧'up'
'right'
。
如何确保传递的参数始终是最新的?
(如果您需要进一步澄清,请告诉我)
答案 0 :(得分:2)
要查看值的更改,您需要引用这些值,并确保更改值的代码和读取值的代码都使用对相同值的引用。
有几种方法可以做到这一点,但它将涉及一个具有多个对象属性的对象,这些对象属性将具有目标值。但是你将传递对象,而不是单个值。
从你提供的那个小东西看来,你有一个 snakeGame 对象。您可以使用该对象存储某些属性,例如,它可以具有属性 grid 。但是你也可以引入另一个对象,用于存储你的 snakeGame 对象中你不想拥有的东西。这可能是 body 和/或方向的情况。
例如:
// Use object properties instead of separate variables:
var snake = {
body: 'xxxx',
direction: 'L'
}
var snakeGame = {
// You can also add properties to your existing object:
grid: [[0,0,0],[0,0,0],[0,0,0]],
createInterval: function(f, snake, interval) {
// Pass `this` and snake objects:
setInterval(f.bind(this, snake), interval);
},
move: function(snake) {
// use this.grid, snake.body and snake.direction:
//....
}
// etc
};
// Call with objects only (except for the constant interval)
snakeGame.createInterval(snakeGame.move, snake, interval);
// When you change direction:
$('#up').keydown(function () {
// ... do not assign to snake, but to snake.direction:
snake.direction = 'U';
// ...
// Same principle with snake.body.
});
我只是选择将 grid 定义为 snakeGame 的属性,将 direction 和 body 定义为属性一个新引入的对象。但你可能想要以不同的方式做到这一点。这只是一个例子。其实质是您传递对象,而不是原始值,但是您将分配给这些对象的属性,从不重新定义对象本身。