使用setInterval将动态变量传递给函数

时间:2017-07-07 17:33:56

标签: javascript jquery timer setinterval

我正在尝试传递“动态”(按键事件频繁更改数据)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'

如何确保传递的参数始终是最新的?

(如果您需要进一步澄清,请告诉我)

1 个答案:

答案 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 定义为属性一个新引入的对象。但你可能想要以不同的方式做到这一点。这只是一个例子。其实质是您传递对象,而不是原始值,但是您分配给这些对象的属性,从不重新定义对象本身。