JavaScript无限循环帮助?为什么会这样?

时间:2014-01-19 21:02:55

标签: javascript for-loop infinite-loop

编辑:这是一个完整代码的pastebin: http://pastebin.com/EVAyxh2N

我在下面粘贴了我的代码。如果有人能弄清楚为什么我会从中获得无限循环,我很乐意看到!从本质上讲,我在foor-loop中有一个for循环,并且工作正常,但我想将rect数据存储在一个数组中以便稍后可以访问它,所以我创建了另一个for循环来处理来自然后,为每个数组创建矩形。

// Create custom "tile" object
function tileObj(x, y, img) {
    this.x = x;
    this.y = y;
    this.img = img;
}

// Create empty array to store tile data
var tiles = [];

// Create tile-grid, map.grid sized rectangles that will adopt tileset images
function gridTiles() {
    for (var x = 0; x <= map.width; x += map.grid) {
        for (var y = 0; y <= map.height; y += map.grid) {

            var newTile = new tileObj(x, y, "red");
            tiles.push(newTile);

            for (var z = 0; z < tiles.length; z++) {
                tile = tiles[z];
                ctx.rect(tile.x, tile.y, map.grid, map.grid);
                ctx.fillStyle = tile.img;
                ctx.fill();
            }
        }
    }
}
gridTiles();

2 个答案:

答案 0 :(得分:2)

如果map.grid为<= 0,则可能是无限循环。

我认为在创建了所有tile对象后,你想要z for循环:

// Create custom "tile" object
function tileObj(x, y, img) {
    this.x = x;
    this.y = y;
    this.img = img;
}

// Create empty array to store tile data
var tiles = [];

// Create tile-grid, map.grid sized rectangles that will adopt tileset images
function gridTiles() {
    for (var x = 0; x <= map.width; x += map.grid) {
        for (var y = 0; y <= map.height; y += map.grid) {

            var newTile = new tileObj(x, y, "red");
            tiles.push(newTile);

        }
    }
    for (var z = 0; z < tiles.length; z++) {
        tile = tiles[z];
        ctx.rect(tile.x, tile.y, map.grid, map.grid);
        ctx.fillStyle = tile.img;
        ctx.fill();
    }
}
gridTiles();

仅供参考,除非map.grid<= 0,否则我认为这不是一个无限循环。它似乎很可能是一个非常非常缓慢的循环执行循环,因为你在每一块瓷砖上循环很多次。

答案 1 :(得分:1)

gridTiles如何访问地图对象?它在窗口或文档范围内吗?

无论哪种方式,请确保网格值为正,否则您将进入无限循环。

function gridTiles(){
  var grid = map.grid; //assume you have access to it
  if (grid<=0){
    console.warn('Invalid grid width');
    return;
  }

  // continue your function

}