Почему присваиваем переменной функцию, а если так не сделать, и просто поместить в alert саму функцию, выводит просто её содержимое в текстовом виде:
В первом примере вы выводите результат работы функции `counter()` (это число). Во втором примере вы выводите результат работы функции `makeCounter()` (это функция `counter()`).
Попробуйте сделать так:
`alert(makeCounter()())`
И посмотреть на содержимое. Думаю станет понятнее.
Почему в следующих итерациях count увеличивается на 1. Хотя, функция makeCounter должна вызываться как бы заново, и присваивать переменной count = 0.
С чего это она должна вызываться заново? Вы вызываете `makeCounter()` только один раз, а далее на каждой итерации вызываете только `counter()`.