Ответ 1
Сначала я бы сказал, что 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 или нет, это немного спорно, я полагаю. Но я бы сказал, что хорошая практика заключается в том, чтобы делать более явное понимание результата обработки при работе с вложенными итераторами.