setTimeout ожидает первым аргументом функцию, которую он вызовет когда-то (когда пройдет заданный интервал), в первом случае вызов производится сразу в месте объявления.
pmozil, функция, но вы в setTimeout передаёте не её саму, а результат её выполнения. А так как clearInterval не возвращает ничего, то и передаёте в setTimeout вы ничего, а именно undefined.
У вас есть функция timeOut, которая принимает анонимную функцию. Почему? Потому что вы передаете указатель на функцию. Он что-то делает, в нашем случае интервал и только потом вызывает вашу функцию (необязательно анонимную). А в вашей функции может быть написано что угодно, включая вызов других функции. Если резюмировать - так надо.