当我运行代码时,出现以下错误:
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 中找到有关 by
、when
和其他循环功能的更多详细信息。 .
当我在这里时,不要这样做:
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/