【问题标题】:Is this irregular behavior caused by Javascript running asynchronously?这种异常行为是由 Javascript 异步运行引起的吗?
【发布时间】:2014-12-13 23:29:11
【问题描述】:
  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]。这有意义吗?

【问题讨论】:

  • 代码中没有任何异步,除非你调用的函数是异步的。
  • 所以我通过节点而不是通过浏览器运行它来检查它。节点正确显示它们,但是,我不明白为什么浏览器仍将 [3, 2] 显示为 Coord 的值。
  • 你能发布 Coord() 构造函数吗?

标签: javascript asynchronous


【解决方案1】:

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

所以,在行中

console.log(head, newCoord);

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

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

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

【讨论】:

  • 对,这就解释了。有什么理由只在 Chrome 中发生这种情况,而不是通过节点运行程序?
  • @DennisShy 正如链接中的答案之一所说,console.log 的行为没有标准化。因此,没有任何理由在 Chrome 和 node 中应该是相同的。
  • @DennisShy Chrome 在这方面真的很糟糕;它对console 函数的实现完全不符合开发人员的需求。作为用户,我喜欢 Chrome,但对于开发,我使用 Firefox 和 Firebug(也不完美,但不那么奇怪)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 2016-02-01
  • 2017-03-30
  • 2020-07-28
相关资源
最近更新 更多