【问题标题】:How to reference to the variable as it was in a loop? [duplicate]如何在循环中引用变量? [复制]
【发布时间】:2019-04-14 16:03:34
【问题描述】:

使用以下代码,我希望根据指针下的矩形登录控制台 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>

【问题讨论】:

    标签: javascript loops variables konvajs


    【解决方案1】:

    当您的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 代码,无法使用 let
    • 我更新了一个答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2017-04-25
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多