这种不规则行为是由Javascript异步运行引起的吗?

Is this irregular behavior caused by Javascript running asynchronously?

本文关键字:运行 异步 Javascript 不规则      更新时间:2023-09-26
  Snake.prototype.move = function() {
    var head = this.head();
    var newCoord = new Coord(head.pos);
    console.log(head, newCoord);
    console.log(head.pos, newCoord.pos);
    this.segments.push(newCoord);
    head.plus(this.dir);
    if (this.growingCount > 0) {
      this.growingCount -= 1;
    } else {
      this.segments.pop();
    }
  };

Coord() 构造函数和plus函数:

var Coord = SnakeGame.Coord = function(pos) {
    this.pos = pos;
  };
  Coord.prototype.plus = function(dir) {
    if (dir === "U") {
      this.pos[0] -= 1;
    } else if (dir === "D") {
      this.pos[0] += 1;
    } else if (dir === "R") {
      this.pos[1] += 1;
    } else if (dir === "L") {
      this.pos[1] -= 1;
    }
  };

head()返回Snake实例上 segments 属性中的第一个段。

我看到的问题是,似乎两个console.log显示出不同的结果。第一行显示pos值为 [3, 2] 的Coord对象(不应该是这种情况,因为head尚未更新)。下一个console行,输出 [3, 3] 和 [3, 3](应该是这种情况)。

这是怎么回事?我觉得错误正盯着我的脸,我看不到它。

澄清:基本上,headnewCoord首次实例化时具有相同的位置(不变)。在head.plus(this.dir);线之后,head应该比newCoord多一个位置。

该方法的一个执行应head.pos为 [3, 2],newCoord应为 [3, 3]。下一次执行,head.pos应该是 [3, 1],另一个newCoord应该是 [3, 2]。这有意义吗?

console.log可以是异步的。看一看:

  • JavaScript 控制台在分配变量之前打印变量的赋值?
  • console.log() 异步还是同步?

所以,在行

console.log(head, newCoord);

您正在传递对head 的引用。在评估参照以打印其位置时,位置已经更改。相反,在另一行中:

console.log(head.pos, newCoord.pos);

您正在传递对当前存储在 head.pos 的对象的引用。然后,您可以为 head.pos 分配另一个值,但由 console.log 触发的进程(可能在此之后发生)仍将具有对原始对象的引用,因此它实际上将打印console.log时间时的位置值。