まず、2つの配列内包表記はあまり維持しやすいパターンではないと言えます。それでは、少し分解してみましょう。
cross = (A, B) ->
for a in A
for b in B
a+b
alert JSON.stringify(cross [1,2], [3,4])
ここで起こっていることは、内部が独自の理解コレクターを持つクロージャーを作成することです。したがって、すべてのbを実行し、結果を配列として返します。この配列は、親の理解結果コレクターにプッシュされます。少しファンキーな内部ループからの戻り値を期待しているようなものです。
代わりに、自分で結果を収集するだけです。
cross = (A, B) ->
results = []
for a in A
for b in B
results.push a + b
results
alert JSON.stringify(cross [1,2], [3,4])
または、それでもクレイジーな理解の魔法をやりたい場合は、次のようにします。
cross = (A, B) ->
results = []
results = results.concat a+b for b in B for a in A
results
alert JSON.stringify(cross [1,2], [3,4])
これがCSのバグであるかどうかは、少し議論の余地があると思います。ただし、ネストされたイテレータを処理する場合は、より明確な理解結果の処理を行うことをお勧めします。