일반함수 정의문의 경우 함수명을 선언하고 그 이름을 사용해서 호출한다.
이 방법은 함수이름만 알고 있으면 어디서나 함수를 실행할 수 있어서 많이
사용한다. 이 밖에 함수 이름을 지정하지 않고 사용하거나, 함수를 호출하지 않고,
바로 실행하는 함수도 있다.
함수 중 익명 함수나 즉시 실행함수를 모두 함수 표현식이라고 한다.
이름이 없는 함수를 말한다. 즉, 익명함수를 선언할때는 이름을 붙이지 않는다.
[기본형]
Let 변수명 = function(){
자바스크립트코드;
}
변수명();

이름이 변수에 있느냐 함수 옆에 있느냐?의 차이가 정의문과 조금의 차이이다.
그리고 호이스팅!!!!!!!이 안 됨
밑에서 확인

sum()을 위호 올렸더니
도큐먼트에 안 뜸, 콘솔 창 갔더니 오류남.
또한 선언되기 이전에 let도 호이스팅이 안 됨 !
만약 let이 아니라 호이스팅이되는 var로 바꿔도 오류가 난다.

왜????????? sum에는 함수가 등록되있지 않기 때문에 undefind만 있는 상태이다.
var sum은 하나의 변수이고, 값을 할당하기 전에는 undefined값이 붙는다.
그럼 나오지 않는 이유는 위에서 아래로 내려오는 스크립트라서
위에서 오류가 나면 밑은 나오지 않기 때문이다.
즉, 먼저 함수 등록을 해놓고 호출은 나중에 해야한다고 생각하면 된다.
일반함수는 가능하다.

var변수의 경우였을때의 오류
만약
원래 해놨던 let으로 선언되어진 변수의 경우
언카운트 에러가 발생 됨.
SUM이라는 변수는 선언된 적이 없다는 오류가 발생한다.
왜냐하면 호이스팅이 없어서 !!!!!!!!!
자주 사용하는 함수는 일반함수로 만듦 필요할때마다 쏙쏙 뽑아쓰는 용
익명함수는 한 번 실행하고 버릴 것들을 만든다-> 이벤트, 브라우저에서 뭔가를 클릭 혹은 드래그일때 사용.
일반적으로 함수는 선언하고 필요할때마다 호출해서 실행하는 방법을 많이 사용한다.
하지만 한번만 실행하는 함수라면 함수를 정의하면서 동시에 실행할 수도 있다.
바로 즉시 실행함수를 이용하면 된다.
즉시 실행 함수는 함수를 실행하는 순간에 자바스크립트 해석기에서 함수를 해석한다.
[기본형]
(function(매개변수){
자바스크립트
})(인수);

함수를 호출하지 않았는데
알아서 출력이 되어있다.
!!

같은 뜻으로 이런 문법도 사용가능하다 !
1.이름 입력받고
2.네임에 들어가면
3. 즉시실행함수로 들어가면
4.매개변수로 아동
5.매개변수를 받으면 도큐먼트로 이동
6.즉시 실행
또 다른 익명(즉시실행)함수 예시

3이 나옴. 매개변수!!!는 네모박스이고 , 자바스크립트코드를 중간에 끼운다.

즉시실행함수의 스코프를 가짐.
지역변수이기 때문에 -> 안전하게 보관됐다고 볼 수 있음.
ler은 함수 안에 갇혀있음. 같은 변수를 만들었어도 갇혀있기 때문에 충돌이 나지않는다.
이렇게 내가 작업한 함수를 보호 할 수 있음
즉시실행하면서 보관할 수 있는 좋은 방법임.

이렇게 출력이 안전하게 됨.
즉, 개발자 a와 b는 동일한 이름의 변수와 함수를 선언했다. 하지만 각각 즉시
실행함수로 감싸놓았기 때문에 각 변수와 함수는 즉시 실행 함수 안의 블록 스코프(유효범위)를 가진다.
개발자 a함수에 있는 num과 menu는 개발자b가 선언한 num과 menu와 각각 다른 함수와 변수로 취급된다.
그렇기 때문에 변수나 함수의 충돌없이 함수가 정상 실행된다. (스코프가 다르기 때문에 정상적으로 실행된 것임)
만약에 실행시점이 당장이 아니라 특정한 실행시점을 가져야한다면???????????
일반함수나 익명함수 안에 넣어주면 된다. 예))스크롤을 내려 실행되는 함수들은 일반 or익명함수로 적용하면 됨.