С помощью следующего кода я хочу войти в консоль 1, 2 и 3 в зависимости от прямоугольника под указателем. Я всегда получаю последнее значение, три.
Я не понимаю, почему и как решить проблему.
<script src = "https://unpkg.com/[email protected]/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.info(i);
});
}
stage.draw();
</script>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда ваше событие 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.info(i);
});
}
stage.draw();<script src = "https://unpkg.com/[email protected]/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.info(i)
};
})(i));
}
stage.draw();<script src = "https://unpkg.com/[email protected]/konva.min.js"></script>
<div id = "container"></div>Я обновил ответ
Я использую старый код javascript и не могу использовать let