일반적인 프로그래밍 언어에서의 함수 선언과 비슷합니다.
function 함수명(){
구현 로직
}
유연한 자바스크립트 언어의 특징을 활용한 선언 방식 - 함수를 변수화시킬 수 있다.
const 함수명 = function(){
구현 로직
}
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위(scope)의 최상단에 선언하는 것을 말한다.
함수 선언식은 호이스팅에 영향을 받지만, 함수표현식은 호이스팅에 영향을 받지 않습니다.
예제)
// main
try{
declare(); // 함수 선언문 실행
expresses(); // 함수 표현식 실행
} catch(error){
console.log("에러 발생");
}
function declare(){
console.log("declare");
};
const expresses = () => console.log("express");
// 실행 결과
// declare
// 에러 발생
즉, 호이스팅을 통해 declare함수는 메인함수가 실행되기 전 제일 상단에서 선언된다. 하지만 expresses함수는 상단에 선언되지 않는 것을 볼 수 있다. 그렇다면 이 코드는 실제로 아래와 같이 인식한다.
// 함수 선언
function declare(){
console.log("declare");
};
// 변수 선언
const expresses;
// main
try{
declare(); // 함수 선언문 실행
expresses(); // 함수 표현식 실행
} catch(error){
console.log("에러 발생");
}
const expresses = () => console.log("express");
// 변수는 global
let variable = "global";
function func(){
// 함수 안에 있는 변수는 local
let variable = "local";
const clouser = () => {
console.log(variable);
}
return clouser;
}
// 내부 함수를 리턴(함수 표현식을 사용하기에 가능)
const reference = func();
// reference의 스코프는 전역임에도 불구하고 func안에 있는 변수를 출력
reference(); // 출력: local;
함수 표현식을 통해 내부 함수의 객체를 func()함수의 리턴값으로 사용할 수 있게 되고 이를 통해 func()함수의 내부 변수의 값을 가져올 수 있게 된다. 지금은 이해가 잘 안될 수도 있으니 뒤에서 더 자세히 다루도록 하겠다.
function func(fn){
fn();
}
const callback = () => console.log("This is 콜백");
func(callback); // 출력 : This is 콜백
콜백함수도 마찬가지로 callback이라는 변수에 callback함수의 객체를 담을 수 있게 되었고 이를 통해 func함수를 통해 실행이 가능해졌다. 콜백함수에 대해서는 뒤에서 더 잘 다루도록 하겠다.
참고자료
네이버 부스트 코스(웹 프로그래밍 풀스택) https://www.boostcourse.org/web316/lecture/254283?isDesc=false
(꼬꼬마 블로그) https://wlswoo.tistory.com/54