javascript - 如何在循环中引用变量?

标签 javascript loops variables konvajs

<分区>

使用以下代码,我希望根据指针下方的矩形登录到控制台 1 2 和 3。我得到的总是最后一个值,三。

我不明白为什么以及如何解决这个问题。

<script src="https://unpkg.com/konva@2.4.2/konva.min.js"></script>

<div id="container"></div>
 
<script>
var stage = new Konva.Stage({
    container: 'container',
    width: 100,
    height: 100
});

var layer = new Konva.Layer();
stage.add(layer);
 
for (var i=0; i<3; ++i) {
    var rect = new Konva.Rect({
        x: 10,
        y: 30*i,
        width: 50,
        height: 20,
        fill: "red",
        stroke: "black",
        strokeWidth: 4
    });
   
    layer.add(rect);
   
    rect.on("mousemove", function() {
	    console.log(i);
    });
}
   
stage.draw();

</script>

最佳答案

当您的mousemove 事件发生时,i 已经并且永远是3

尝试使用 let i=0 而不是 var i=0。使用 let,您的 i 变量将在本地循环范围内,因此将与 layer

相关

代码:

 var stage = new Konva.Stage({
     container: 'container',
     width: 100,
     height: 100
});

var layer = new Konva.Layer();
stage.add(layer);
 
for (let i=0; i<3; ++i) {
    var rect = new Konva.Rect({
        x: 10,
        y: 30*i,
        width: 50,
        height: 20,
        fill: "red",
        stroke: "black",
        strokeWidth: 4
    });
   
    layer.add(rect);
   
    rect.on("mousemove", function() {
	    console.log(i);
    });
}
   
stage.draw();
<script src="https://unpkg.com/konva@2.4.2/konva.min.js"></script>

<div id="container"></div>

另一种选择是将 i 传递给您的处理函数:

var stage = new Konva.Stage({
    container: 'container',
    width: 100,
    height: 100
});

var layer = new Konva.Layer();
stage.add(layer);
 
for (var i=0; i<3; ++i) {
    var rect = new Konva.Rect({
        x: 10,
        y: 30*i,
        width: 50,
        height: 20,
        fill: "red",
        stroke: "black",
        strokeWidth: 4
    });
   
    layer.add(rect);
   
    rect.on("mousemove", (function(i) {
        return function(e) { 
            console.log(i)
        };
    })(i));
}
   
stage.draw();
<script src="https://unpkg.com/konva@2.4.2/konva.min.js"></script>

<div id="container"></div>

关于javascript - 如何在循环中引用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253609/

相关文章:

javascript - Requirejs 优化器 - 模块设置无法跳过外部源

c++ - 检查一个字符串是否有多个彼此相邻的逗号C++

python - 用列表理解替换循环,而不是循环获取函数以在列表理解中返回新数组

php - 如何在PHP代码中添加测试参数

java - 在另一个变量中插入一个变量

javascript - 查找提及的正则表达式

javascript - 是否可以将流同步转换为缓冲区?

javascript - 在指定图层的 pointermove 上更改光标样式

excel - 如何在 Excel 中使用 VBA 遍历所有列

c++ - 在构造函数中逐值初始化一个成员vector<vector<int>>