javascript - 如何在循环中引用变量?
问题描述
使用以下代码,我希望根据指针下的矩形登录控制台 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>
推荐阅读
- python-3.x - 对于我的脚本中无法实现的每一行“for循环”
- python - 循环使用 lambda 列并使用其他列的值进行计算
- jprofiler - 监控 JProfiler 的许可证服务器
- vue.js - 如何在vuejs的子组件中将值从prrent传递到方括号
- ios - 从 nib 文件加载视图时出现问题,视图宽度为 0.0
- flutter - 我怎样才能摆脱这种颤振覆盖错误?
- google-apps-script - 如果 string.match() 不匹配,为什么谷歌应用程序脚本的执行被取消?
- c# - 在 Linq 表达式中使用 `.Result` 调用异步方法会导致死锁
- javascript - 将数学运算的结果绑定到 vuejs 中的输入或 div 结果
- python - 无法在 keras(tensorflow) 中使用 model.predict()