javascript - Coffeescript:为什么这个类中的这个函数说它的参数未定义?

标签 javascript coffeescript

当我运行代码时,出现以下错误:

TypeError: pivot is undefined

这是错误引用的相关类:

class Hero
  constructor: (@color, @direction, @x, @y) ->
  pivots: []
  addPivot: (pivot) -> @pivots.push(pivot)
  onPivot: (pivot) -> pivot.x == @x && pivot.y == @y
  applyPivots: () ->
    indexToRemove = -1
    for i in [0..@pivots.length - 1]
      pivot = @pivots[i]
      if (@onPivot(pivot))
        @direction = pivot.direction
        indexToRemove = i
    @pivots.splice(indexToRemove, 1)

为什么会发生这种情况?这是它生成的 JavaScript:

  Hero = (function() {
    function Hero(color, direction, x, y) {
      this.color = color;
      this.direction = direction;
      this.x = x;
      this.y = y;
    }

    Hero.prototype.pivots = [];

    Hero.prototype.addPivot = function(pivot) {
      return this.pivots.push(pivot);
    };

    Hero.prototype.onPivot = function(pivot) {
      return pivot.x === this.x && pivot.y === this.y;
    };

    Hero.prototype.applyPivots = function() {
      var i, indexToRemove, pivot, _i, _ref;

      indexToRemove = -1;
      for (i = _i = 0, _ref = this.pivots.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
        pivot = this.pivots[i];
        if (this.onPivot(pivot)) {
          this.direction = pivot.direction;
          indexToRemove = i;
        }
      }
      return this.pivots.splice(indexToRemove, 1);
    };

    return Hero;

  })();

错误所在行显示:

  return pivot.x === this.x && pivot.y === this.y;

最佳答案

您的 for 循环限制有问题。假设您的 @pivots 数组为空,则 applyPivots 中的 for 循环将如下所示:

for i in [0..-1]
  #...

所以它将从零开始并下降到-1。但是 @pivots 是空的,所以这样:

pivot = @pivots[i]

将在pivot中为您提供一个未定义,并且所有内容都会在一堆困惑中分崩离析。

您可能希望使用 for 循环的 for element in array 形式:

applyPivots: () ->
  indexToRemove = -1
  for pivot, i in @pivots
    if(@onPivot(pivot))
      @direction = pivot.direction
      indexToRemove = i
  @pivots.splice(indexToRemove, 1) if(indexToRemove >= 0)

如果没有找到任何东西(即indexToRemove == -1),你可能不想做任何事情,所以我免费把它放进去。

我认为你也可以走得更远一点。像这样的事情:

for pivot, i in @pivots when @onPivot(pivot)
  @direction = pivot.direction
  @pivots.splice(i, 1)
  break

您可以使用 when 跳过循环中您不关心的内容,并且由于您只想从 @pivots 中删除一项内容,因此您可以一旦找到它就跳出循环。这假设 @pivots 中只会出现匹配,如果可以有多个命中并且您确实想要最后一个,那么您可以通过添加 by -1 来向后退:

for pivot, i in @pivots by -1 when @onPivot(pivot)
  # same as above...

您可以在 the fine manual 中找到有关 bywhen 和其他循环功能的更多详细信息。 .

<小时/>

当我在这里时,不要这样做:

class Hero
  pivots: []

这会将您的数组附加到 Hero 的原型(prototype),以便它被 Hero 的所有实例共享。所以如果你这样做:

h1 = new Hero
h2 = new Hero
h1.pivots.push('pancakes')

然后您还会在 h2.pivots 中看到 'pancakes'。您应该在构造函数中为每个实例提供自己的数组:

class Hero
  constructor: (@color, @direction, @x, @y) ->
    @pivots = [ ]

同样的注意事项也适用于您可能想放入类中的任何可变值。不过,诸如数字和字符串之类的不可变值很好,您只能为这些值分配新值,并且新值将隐藏原型(prototype)的值,因此不会造成任何损害。

关于javascript - Coffeescript:为什么这个类中的这个函数说它的参数未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16931679/

相关文章:

javascript - Firefox 用户禁用 cookie 和 localStorage 的解决方案 - polyfill 不可能

javascript - 组件之间状态变化的问题

jquery - 尽管服务存在但未注入(inject)依赖项

javascript - 如何使用 CoffeeScript 模拟现有代码?

javascript - 如何使用 Firebase 根据查询结果执行服务器验证?

javascript - 使功能分别影响每个测验ID

javascript - 如何在 React 中创建对象的新实例?

ruby-on-rails - rails : CoffeeScript is not defined on new Application

javascript - async.waterfall 重复调用

javascript - AEM 6.3 : Sling Servlet registered with resourceType