Function¶
- 하나의 특별한 목적의 작업을 수행하도록 설계된 독립적인 블록
 
- JS에서는 Function도 하나의 타입으로 취급한다
- 따라서 함수를 변수에 대입하거나 함수에 프로퍼티를 지정할 수 있다
 
 - return문이 없을 때, 함수는 undifined를 반환한다
 - 선언적(명시적) 함수 정의 : 위치 상관 없음
 - 표현식(익명) 함수 정의 방법 : 호출 전에 미리 선언되어있어야 함
 
매개변수¶
- JS는 인수의 개수와 매개변수의 개수가 일치하는 지 체크하지 않는다
- 매개변수에 인수를 전달하지 않으면, 매개변수의 값은 undefined가 된다
 - 전달된 인수를 모두 추출하려면 
arguments를 사용한다 
 - 디폴트 매개변수 Default parameter : 함수 호출 시 명시된 인수를 전달하지 않았을 경우에 사용하게 될 기본값
- JS의 디폴트 매개변수값은 undefined
 - 사파리, 오페라, 익스플로러에서 지원하지 않음
 
 - 나머지 매개변수 Rest Parameter : 생략 접두사 
...를 사용하여 특정 위치의 인수부터 마지막 인수까지 한 번에 지정 
변수의 유효 범위 Variable scope¶
지역 변수 Local Variable¶
- 함수내에서 선언된 변수
 
- 변수가 선언된 하무 내에서만 유효
 - 함수가 종료되면 메모리에서 사라짐
 - 함수의 매개변수도 지역 변수처럼 동작
 - 지역 변수 선언에는 반드시 var 키워드 사용 
- 키워드를 사용하지 않고 변수를 선언하면 전역 변수로 선언된다
 
 
전역 변수 Global Variable¶
- 함수의 외부에서 선언된 변수
 
- 프로그램의 어느 영역에서나 접근 가능
 - 웹 페이지가 닫혀야만 메모리에서 사라짐
 - 함수 내부에서도 접근하여 변경 가능
 
블록 변수 Block Variable¶
- 블록 안에서만 사용되는 변수
 
- let
 
함수의 유효 범위 Function scope¶
- JS는 함수를 블록({Block}) 대신 사용한다
함수는 자신이 정의된 범위 안에서 정의된 모든 변수 및 함수에 접근할 수 있다 
- 블록 단위의 유효 범위 : 블록을 기준으로 하는 유효 범위
 - '전역 함수' : 모든 전역 변수와 전역 함수에 접근 가능
 - '내부 함수' : 다른 함수내에 정의된 함수. 부모 함수에서 정의된 모든 변수 및 부모 함수가 접근할 수 있는 모든 다른 변수까지 접근 가능
 
함수 호이스팅 Hoisting¶
- 함수의 유효 범위가 변수가 선언되기 전에도 똑같이 적용되는 것
JS 함수 안에 있는 모든 변수의 선언은 함수의 맨 처음으로 이동된 것처럼 동작한다 
- 다음과 같은 코드에서, 첫 write의 num이 전역 변수일 거라 생각하지만,
 - 함수 호이스팅에 의해 다음과 같이 처리된다
 
High Order Function¶
- 함수를 데이터로 다루는 함수
함수 호출 시 인수로 또다른 함수를 전달할 수 있으며 리턴값으로 함수를 전달할 수 있다 
<button onClick="clickProcess(100);">숫자</button>
<button onCLICK="clickProcess('100');">문자열</button>
<button onclick="clickProcess(true);">논리값</button>
<button onclick="clickProcess(function(){ });">함수</button>
<button onclick="clickProcess([ ]);">배열</button>
<button onclick="clickProcess({ });">객체</button>
<button onclick="clickProcess();">????</button>
<script>
function clickProcess(p) {
    if (typeof p == "number") {
        window.alert("숫자 전달!!");
    } else if (typeof p == "string") {
        alert("문자열 전달!!");
    } else if (typeof p == "boolean") {
        alert("논리값 전달!!");
    } else if (typeof p == "function") {
        alert("함수 전달!!");
    } else if (typeof p == "object") {
        if (Array.isArray(p))
            alert("배열객체 전달!!");
        else 
            alert("객체 전달!!");
    } else if (typeof p == "undefined") {  // p == undefined
        alert("전달된 아규먼트 없음!!");
    }   
}
</script>
Quote