未捕获的TypeError:无法设置未定义

时间:2015-07-23 19:39:22

标签: javascript html canvas

现在这很奇怪,我基本上调用函数“sortTiles()”两次,第一次,它循环遍历,并返回一个漂亮的数组,就像它应该做的那样。但是我第二次调用它时,它不起作用,并将标题中所述的错误抛出到特定行: tiles [y] [x] = tile;

第一次,“sortTiles()”返回的数组被放入一个名为“solution”的全局数组中。第二次调用该函数时,它将从解决方案数组中获取tile X和Y坐标。

我在这里做的是它基本上扫描一个滑动拼图,借助html5画布和prnt_scrn +粘贴到网站上。如上所述,第一次执行此操作时,您将获取解决方案的屏幕截图,将其粘贴,并将所有坐标标记为正常。第二次,它抛出一个错误:(

function getTile(x, y) {
    var id = 0;
    for (i = 0; i < 2; i++) {
        for (i2 = 0; i2 < 2; i2++) {
            var data = context.getImageData(x + i * 48 + 5 - (i * 10), y + i2 * 48 + 5 - (i2 * 10), 1, 1).data;
            id += data[0] + data[1] + data[2];
        }
    }
    return id;
}

function findTile(number) {
    for (y = 0; y < 5; y++) {
        for (x = 0; x < 5; x++) {
            if (solution[y][x] == number) {
                return [x, y];
            }
        }
    }
}

function sortTiles() {
    context.font = "20px Georgia";
    var tiles = [];
    tiles.length = 0;
    for (y = 0; y < 5; y++) {
        tiles[y] = [];
        for (x = 0; x < 5; x++) {
            var tile = getTile(108 + x * 56, 34 + y * 56);
            tiles[y][x] = tile;
            if (solution.length != 0) {
                var coordinate = findTile(tile);
                context.fillText(coordinate[0] + ", " + coordinate[1], 108 + x * 56 + 12, 34 + y * 56 + 36);
            } else {
                context.fillText(x + ", " + y, 108 + x * 56 + 12, 34 + y * 56 + 36);
            }
        }
    }
    return tiles;
}

1 个答案:

答案 0 :(得分:2)

您的xy个变量是全局的,并且在sortTilesfindTile之间存在冲突。使用var将其设为本地。

function getTile(x, y) {
    var id = 0;
    for (var i = 0; i < 2; i++) {
        for (i2 = 0; i2 < 2; i2++) {
            var data = context.getImageData(x + i * 48 + 5 - (i * 10), y + i2 * 48 + 5 - (i2 * 10), 1, 1).data;
            id += data[0] + data[1] + data[2];
        }
    }
    return id;
}

function findTile(number) {
    for (var y = 0; y < 5; y++) {
        for (var x = 0; x < 5; x++) {
            if (solution[y][x] == number) {
                return [x, y];
            }
        }
    }
}

function sortTiles() {
    context.font = "20px Georgia";
    var tiles = [];
    tiles.length = 0;
    for (var y = 0; y < 5; y++) {
        tiles[y] = [];
        for (var x = 0; x < 5; x++) {
            var tile = getTile(108 + x * 56, 34 + y * 56);
            tiles[y][x] = tile;
            if (solution.length != 0) {
                var coordinate = findTile(tile);
                context.fillText(coordinate[0] + ", " + coordinate[1], 108 + x * 56 + 12, 34 + y * 56 + 36);
            } else {
                context.fillText(x + ", " + y, 108 + x * 56 + 12, 34 + y * 56 + 36);
            }
        }
    }
    return tiles;
}