Краткое объяснение.
setInterval( STRING , NUMBER )
использует eval
для интерпретации строки, и это eval
выполняется в глобальной области видимости, а не в области действия функции, поскольку характер тайм-аута делает его выпадающим из любой области функции.
sayHello
находится внутри функции и как таковая не присутствует в глобальной области видимости.
То есть setInterval( STRING , NUMBER )
выдаст ошибку отсутствующего объекта в данном примере.
setInterval( FUNCTION , NUMBER )
гарантирует, что тайм-аут использует ссылку / указатель и избегает необходимости делать глобальные eval
.