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