为什么控制台不记录变量值?

Why console not logging variable value?

我正在尝试制作一个简单的 JS canvas 画线程序。当有人第一次点击 canvas 时,它应该存储它的 x 和 y 值(变量 x2y2)。当有人第二次点击 canvas 时,它应该将这次点击的 x 和 y 值存储在另一个变量(变量 x1y1)中。我的问题是该程序仅存储第二次单击的值,并且控制台将变量记录为 "undefined".

所以综上所述,当有人点击时,x2y2的值是"undefined",而它们应该是一个数字。主要目标是获取 2 个 x 和 y 值并与它们对齐。希望有人能帮忙。

这是我试过的代码:

<!DOCTYPE html>
<html>

<body>

  <canvas id="myCanvas" width="500" height="350" style="border:1px solid #d3d3d3;"></canvas><br>

  <script>
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");




    var a = true;

    function getMousePosition(canvas, event) {
      let rect = canvas.getBoundingClientRect();
      let x2;
      let y2;
      let x1;
      let y1;
      if (a) {
        let x2 = event.clientX - rect.left;
        let y2 = event.clientY - rect.top;
        a = false;
      } else {
        let x1 = event.clientX - rect.left;
        let y1 = event.clientY - rect.top;
        a = true;
        ctx.beginPath();



        ctx.moveTo(x2, y2);
        ctx.lineTo(x1, y1);

        ctx.stroke();
        ctx.closePath();
        console.log("Coordinate x1: " + x1,
          "Coordinate y1: " + y1);
        console.log("Coordinate x2: " + x2,
          "Coordinate y2: " + y2);

      }


    }

    let canvasElem = document.querySelector("canvas");

    canvasElem.addEventListener("mousedown", function(e) {
      getMousePosition(canvasElem, e);
    });
  </script>






</body>

</html>

-JSman225

问题是您在多个地方定义了变量。为了稍后访问它们,您需要将它们存储在主脚本范围内,而不是像 a 变量那样存储在函数内。

看看这个。

<!DOCTYPE html>
<html>

<body>

  <canvas id="myCanvas" width="500" height="350" style="border:1px solid #d3d3d3;"></canvas><br>

  <script>
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");

    var x2, y2, x1, y1;


    var a = true;

    function getMousePosition(canvas, event) {
      let rect = canvas.getBoundingClientRect();

      if (a) {
        x2 = event.clientX - rect.left;
        y2 = event.clientY - rect.top;
        a = false;
      } else {
        x1 = event.clientX - rect.left;
        y1 = event.clientY - rect.top;
        a = true;
        ctx.beginPath();



        ctx.moveTo(x2, y2);
        ctx.lineTo(x1, y1);

        ctx.stroke();
        ctx.closePath();
        console.log("Coordinate x1: " + x1,
          "Coordinate y1: " + y1);
        console.log("Coordinate x2: " + x2,
          "Coordinate y2: " + y2);

      }


    }

    let canvasElem = document.querySelector("canvas");

    canvasElem.addEventListener("mousedown", function(e) {
      getMousePosition(canvasElem, e);
    });
  </script>






</body>

</html>

您也在重新初始化事件侦听器中的变量。这就是为什么它在每个事件调用中都未定义的原因

以下是您可以使用的更新代码


<!DOCTYPE html>
<html>

<body>

  <canvas id="myCanvas" width="500" height="350" style="border:1px solid #d3d3d3;"></canvas><br>

  <script>
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");



    let x2;
    let y2;
    let x1;
    let y1;
    var a = true;

    function getMousePosition(canvas, event) {
      let rect = canvas.getBoundingClientRect();
      if (a) {
        x2 = event.clientX - rect.left;
        y2 = event.clientY - rect.top;
        a = false;
      } else {
        x1 = event.clientX - rect.left;
        y1 = event.clientY - rect.top;
        a = true;
        ctx.beginPath();



        ctx.moveTo(x2, y2);
        ctx.lineTo(x1, y1);

        ctx.stroke();
        ctx.closePath();
        console.log("Coordinate x1: " + x1,
          "Coordinate y1: " + y1);
        console.log("Coordinate x2: " + x2,
          "Coordinate y2: " + y2);

      }


    }

    let canvasElem = document.querySelector("canvas");

    canvasElem.addEventListener("mousedown", function(e) {
      getMousePosition(canvasElem, e);
    });
  </script>






</body>

</html>