자바스크립트 함수
- 자바스크립트에서는 함수도 하나의 타입(datatype)이다
- 다른 함수 내에 중첩되어 정의될 수 있다
함수의 정의
- function 키워드로 시작하며 함수이름, 매개변수, 실행문으로 구성된다
function 함수이름(매개변수1, 매개변수2,...) {
함수가 호출되었을 때 실행하고자 하는 실행문;
}
함수의 호출
- 정의된 함수는 프로그램 내에서 호출되어야 비로소 실행된다
- (예) 함수의 정의 및 호출
// 함수의 정의
function addNum(x, y) {
return x + y;
}
// 함수의 호출
var sum = addNum(3, 5); // 함수 addNum()을 호출하면서, 인수로 3과 5를 전달합니다.
// 함수의 호출이 끝난 뒤에는 그 반환값을 변수 sum에 대입합니다.
- 값으로서 사용할 수도 있어, 함수가 변수에 대입되거나 다른 함수의 인수로 전달될 수 있다
함수의 유효 범위 (functions scope)
- 자바스크립트에서 함수는 자신이 정의된 범위 안에서 정의된 모든 변수 및 함수에 접근 가능하다
- 전역 함수는 모든 전역 변수와 전역 함수에 접근 가능
- 다른 함수 내 정의된 내부함수는 부모 함수에서 정의된 변수 및 부모 함수가 접근할 수 있는 변수까지도 접근 가능
var x = 10, y = 20; // 전역 변수
function sub() { // 전역 함수
return x - y; // 전역 변수인 x, y에 접근함.
}
document.write(sub() + "<br>");
function parentFunc() { // 전역 함수
var x = 1, y = 2; // 전역 변수와 같은 이름으로 선언하여 전역 변수의 범위를 제한함.
function add() { // add() 함수는 내부 함수로 선언됨.
return x + y; // 전역 변수가 아닌 지역 변수 x, y에 접근함.
}
return add();
}
document.write(parentFunc());
함수 호이스팅 (hoisting)
- 함수 안에 있는 모든 변수의 선언은 함수의 맨 처음으로 이동된 것처럼 동작한다
- 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선안하는 것을 말한다
- (예)
var globalNum = 10; // globalNum을 전역 변수로 선언함.
function printNum() {
document.write("지역 변수 globalNum 선언 전의 globalNum의 값은 " + globalNum + "입니다.<br>"); // (1)
var globalNum = 20; // globalNum을 지역 변수로 선언함. // (2)
document.write("지역 변수 globalNum 선언 후의 globalNum의 값은 " + globalNum + "입니다.<br>");
}
printNum();
- ❌ (1)에서 globalNum이 전역 변수를 가리킨다 ❌
- 자바스크립트 내부에서는 함수 호이스팅에 의해 다음처럼 코드가 변경되어 처리된다
var globalNum = 10;
function printNum() {
var globalNum; // 함수 호이스팅에 의해 변수의 선언 부분이 함수의 맨 처음 부분으로 이동됨.
document.write("지역 변수 globalNum 선언 전의 globalNum의 값은 " + globalNum + "입니다.<br>"); // (1)
globalNum = 20;
document.write("지역 변수 globalNum 선언 후의 globalNum의 값은 " + globalNum + "입니다.<br>"); // (2)
}
printNum();
- (1) 시점에서는 지역 변수 globalNum가 선언만 되고 초기화되지 않은 상태이기 때문에, undefined 값을 반환한다
- (2) 시점에서는 변수 초기화 이후이므로 초기화된 값 20이 출력된다
매개변수 (parameter)
- JS에서는 함수를 정의할 때 매개변수의 타입을 명시하지 않고, 인수에 대해 타입 검사도 하지 않는다
- 함수의 정의보다 적은 수의 인수가 전달되더라도, 오류가 발생하지 않고 전달되지 않은 매개변수에 자동으로 undefined 값을 설정한다
- (예) 전달된 인수만을 가지고 정상적으로 계산하는 함수
function addNum(x, y, z) {
if(x === undefined) // 함수 호출시 x에 해당하는 인수가 전달되지 않은 경우
x = 0; // 변수 x의 값을 undefined에서 0으로 변경함.
if(y === undefined) // 함수 호출시 y에 해당하는 인수가 전달되지 않은 경우
y = 0; // 변수 y의 값을 undefined에서 0으로 변경함.
if(z === undefined) // 함수 호출시 z에 해당하는 인수가 전달되지 않은 경우
z = 0; // 변수 z의 값을 undefined에서 0으로 변경함.
return x + y + z;
}
addNum(1, 2, 3); // 6
addNum(1, 2); // 3
addNum(1); // 1
addNum(); // 0
arguments 객체
- 함수의 정의보다 더 많은 수의 인수가 전달될 때, 매개변수에 대입되지 못한 인수들을 참조하는 방법
- arguments 객체 : 함수가 호출될 때 전달된 인수를 배열의 형태로 저장
- (예) 인수의 개수에 상관없이 정상적인 계산을 수행하는 함수
function addNum() {
var sum = 0;
for(var i = 0; i < arguments.length; i++) { // 전달받은 인수의 총 수만큼 반복함.
sum += arguments[i]; // 전달받은 각각의 인수를 sum에 더함.
}
return sum;
}
addNum(1, 2, 3); // 6
addNum(1, 2); // 3
addNum(1); // 1
addNum(); // 0
addNum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 55
디폴트 매개변수 (default parameter)
: 함수를 호출할 때 명시된 인수를 전달하지 않았을 경우 사용할 기본값
- 자바스크립트에서 매개변수의 기본값 : undefined
- (예) 매개변수의 기본값 변경
function mul(a, b = 1) { // 인수가 한 개만 전달되면 나머지 매개변수의 값을 언제나 1로 설정해 줌.
return a * b;
}
mul(3, 4); // 12
mul(3); // 3
[참고자료] http://tcpschool.com/javascript/intro
'Web > JavaScript' 카테고리의 다른 글
[JavaScript] 자바스크립트 객체(object) (1) : 참조 및 생성 (0) | 2021.08.03 |
---|---|
[JavaScript] 자바스크립트 함수(function) (2) : 미리 정의된 전역 함수 (0) | 2021.08.03 |
[JavaScript] 자바스크립트 배열(array) : 생성 및 활용 (1) | 2021.08.03 |
[JavaScript] 자바스크립트 제어문 : 조건문, 반복문, 루프 제어(label, continue, break) (0) | 2021.07.16 |
[JavaScript] 자바스크립트 연산자 : 산술, 연산자 우선순위, 대입, 증감, 비교, 논리, 비트 연산자 (0) | 2021.07.16 |