함수에는 2가지 종류가 있다.

이름이 없는 익명함수는 함수를 표현한다고 한다. 이름이 있는 기명함수는 함수를 선언한다고 한다.
함수에는 arguments라는 객체가 자동으로 만들어지기도 한다.

함수 안에서는 언제든지 사용할 수 있다.
함수를 다른 방식으로 더 간편하게 작성하는 방법도 있다.

객체를 반환할때에는 () 로 덮어서 써야함을 주의하자.
const func = (data) => { console.log(data) }
const func2 = data => { console.log(data) } // 매개변수 줄여쓰기
const func3 = data => console.log(data); // 코드블럭 줄여쓰기
const func4 = data => ({ value: data }); // 객체를 반환한다
func("화살표1");
func2("화살표2");
func3("화살표3");
console.log(func4("화살표4").value);
익명 함수를 즉시 실행할 수 있게 함수를 작성하는 방법이 있다.

(function() {
console.log("즉시실행!");
}());
이와 같이 함수를 따로 변수에 저장하거나, 호출하지 않아도 함수를 실행 할 수 있다.
필요에 따라 함수를 먼저 호출하고, 나중에 선언하는 방식을 사용하기도 한다. 기명 함수만 이러한 방식이 가능하며, 이를 호이스팅이라고 한다.

func();
function func() {
console.log("호이스팅!");
}
호출을 먼저 하였음에도 아무런 문제 없이 동작한다. 보통 이렇게 함수 선언을 밑에 하고, 호출을 위에 하는 경우가 많다.
내가 원하는 시간 뒤에 함수를 실행 시키거나, 일정한 시간 간격만큼 함수를 실행 시킬 수 있다.

const timer = setTimeout(() => console.log("1초 뒤 실행!"), 1000);
const timer2 = setInterval(() => console.log("1초 마다 실행!"), 1000);
clearTimeout(timer);
clearInterval(timer2);
타이머 함수에서 인자로 전달한 함수를 콜백함수라고 부른다.