通过future函数循环和设置全局变量

Looping and setting global variables through a future function

本文关键字:设置 全局变量 循环 future 函数 通过      更新时间:2023-09-26

我得到了这段代码,我似乎不能使工作。这似乎是一个范围问题,我想知道你是否有任何想法。

这段代码我认为是坏的。

                click: function(layer) {
                    selectedR = r;
                    selectedC = c;
                    render();
                },

问题是,当我点击图像,它执行的功能,但值为selectedR/selectedC总是被设置为8,8,这意味着它不是抓取变量值从r,c,直到函数被实际点击。你能想出一个方法让我完成这件事吗?我想知道我点击的物品的r c值。如果有帮助的话,我正在使用JQuery/JCanvas库。下面是上下文中的代码:

var selectedR;
var selectedC;

function drawPieces(){
    for( var r = 0; r < 8; r++){
        for(var c = 0; c < 8; c++){
            var x = boardLeft + (c * tileWidth);
            var y = boardTop + (r * tileHeight);
            var piece = gameboard[r][c];
            if(piece.pieceCode == ChessPieceEnum.EMPTY){
                continue;
            }
            $("canvas").drawImage({
                layer: true,
                source: piece.pieceCode.normalImage,
                x: x, 
                y: y,
                cursor: "pointer",
                click: function(layer) {
                    selectedR = r;
                    selectedC = c;
                    render();
                },
                fromCenter: false
            });
            piece.x = x;
            piece.y = y;
        }
    }
}

因此,传递给click函数的层对象似乎是对其自身的引用。因此,只需将r/c添加到图层对象中,然后在匿名函数中访问它。

function drawPieces(){
    for( var r = 0; r < 8; r++){
        for(var c = 0; c < 8; c++){
            var x = boardLeft + (c * tileWidth);
            var y = boardTop + (r * tileHeight);
            var piece = gameboard[r][c];
            if(piece.pieceCode == ChessPieceEnum.EMPTY){
                continue;
            }
            $("canvas").drawImage({
                layer: true,
                source: piece.pieceCode.normalImage,
                x: x, 
                y: y,
                r: r,
                c: c,
                cursor: "pointer",
                click: function(layer){
                    onPieceClick(layer.r, layer.c);
                },
                fromCenter: false
            });
            piece.x = x;
            piece.y = y;
        }
    }
}
function onPieceClick(r,c){
    selectedR = r;
    selectedC = c;
    render();
}