Что происходит в оригинале:
В Javascript есть состав для петель .Объявление внутри скобки имеет три выражения: for(x; y; z){...}
.
x
выполняется один раз до того, как цикл y
является условием, проверяемым перед каждой итерацией.Если значение равно false, цикл остановится z
запускается один раз после каждой итерации
В этом коде вы устанавливаете j = world.m_jointList
, который является первым элементом в связанном списке.Средняя часть цикла for
проверяет правдоподобность из j;
, и после каждой итерации j
устанавливается в j.m_next
, что является указателем на следующий объект в цепочке.Он заканчивается, когда j
оценивается как ложное (в данном случае, вероятно, undefined
).
Чтобы визуализировать это, world
может выглядеть так:
world = {
m_jointList: {
value: 'head',
m_next: world.foo1
},
foo1: {
value: 'foo',
m_next: world.foo2
},
foo2: {
value: 'foo',
m_next: world.tail
},
tail: {
value: 'foo'
}
}
В действительности элементыв списке, вероятно, не существует свойств world
, но это будет работать так же.Обратите внимание, что m_next
не определено в последнем объекте.Иногда будет использоваться значение заполнителя для хвоста, указывающее конец цепочки.
Имя m_jointList
также немного вводит в заблуждение, поскольку оно на самом деле не содержит список, а только первый его элемент..
Это должно быть сделано в coffeescript:
j = world.m_jointList
while j then drawJoint(j, context); j = j.m_next
И это было бы хорошим использованием do...while
в javascript:
var j = world.m_jointList
do { drawJoint(j, context) } while (j = j.m_next)