- 함수란 하나의 특별한 목적의 작업을 수행하도록 설계된 독립적인 블록을 의미하고 필요할 때마다 호출하여 해당 작업을 반복해서 수행할 수 있다.
- 함수를 선언하기 위해서는 keyword, name, parameter, body가 필요하다
- 함수는 하나의 작은 기능 단위로 묶여있으며 항상 출력값을 반환(return)한다.
- 함수를 선언식, 표현식, 화살표 함수로 바꾸어 표현할 수 있다.
- 함수도 하나의 타입이므로 변수에 대입하거나 property를 지정하는 것도 가능하다.
- 함수는 다른 함수 내에 중첩되어 정의될 수도 있다.
function 함수이름(매개변수1, 매개변수2,...) {
// 함수가 호출되었을 때 실행하고자 하는 실행문;
// return;
}
// 함수의 정의
function sum(a, b) {
return a + b;
}
// 함수의 호출
sum(10, 5); // 15
function sum(a, b) {
return a + b;
}
const sum1 = function (a, b) {
return a + b;
}
const sum2 = (x, y) => { return x + y; };
const sum3 = (x, y) => x + y;
const num = x => x;
호이스팅은 '끌어 올리다' 라는 뜻으로 변수나 함수의 선언을 유효 범위(Scope)의 최상단으로 끌어올려지는 것과 같이 동작하는 것이다. 코드가 실제로 이동하진 않으며 변수나 함수를 하단에 선언해도 상단에서 호출할 수 있는 JavaScript만의 특징이다.
코드가 실행되기 전에 자바스크립트 엔진이 파일을 읽으면서 선언된 변수와 함수들을 메모리에 저장한다. 이후 코드가 실행되면 필요한 변수들을 메모리에서 꺼내서 전달한다. 하지만 변수의 값은 코드가 실행되어야 알 수 있기 때문에 메모리에 값이 저장되지 않고 undefined가 할당된다.
변수와 함수 상관없이 호이스팅이 발생하는데 함수가 변수이기 때문이다.
console.log(a); // undefined
var a = 10;
// 실제 동작
var a;
console.log(a);
a = 10;
// 함수 선언 전에 호출되어도 정상적으로 동작
test(); // true
function test() {
return true;
}
test1(); // TypeError: test1 is not a function
var test1 = function () {
return true;
}
test2(); // ReferenceError: test2 is not defined
const test2 = function () {
return true;
}
const a = 5;
function test1() {
console.log(a); // 5
}
function test2() {
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization (TDZ)
const a = 10;
}
let, const는 호이스팅 대상이 아니기 때문에 에러가 발생한다.
하지만 엄밀히 말하면 let이나 const로 선언할 경우 호이스팅을 지원하지 않는 것이 아닌 코드를 선언하는 구문에 도달하기 전에는 변수를 사용하지 못하도록 하는 기능(TDZ, Temporal Dead Zone)이 추가된 것이다.