함수 표현식 VS 함수 선언식
- js에서 함수를 만드는 방식은 두 가지가 존재한다.
함수 선언식
- 함수 선언식에서는
function
키워드를 통하여 함수를 선언한다.function hello(){ console.log("hihi"); } hello() // hihi
함수 표현식
- 함수 표현식에서는 함수를 만들고 변수에 함수를 할당한다.
let hello = function(){ console.log("hihi"); } hello() // hihi
차이점
- 두 가지 방식의 가장 큰 차이점은 호이스팅의 여부이다.
함수 선언식
으로 함수를 선언하는 경우, 함수자체가 호이스팅 되어서 전역적인 접근이 가능하다.- 반면,
함수 표현식
으로 함수를 선언하는 경우, 변수에 함수를 할당하기 때문에 실행지점에 이후에 함수의 사용 및 접근이 가능하다.
hello() // hihi
function hello(){
console.log("hihi")
}
hello() // error
let hello = function (){
console.log("hihi")
}
함수 표현식을 사용했을 때의 장점
함수 표현식을 다른 함수의 인자 값(콜백함수)로 사용할 수 있다.
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
ask(
"동의하십니까?",
function() { alert("동의하셨습니다."); },
function() { alert("취소 버튼을 누르셨습니다."); }
);
- 위처럼 함수에 이름을 붙이지 않고 사용하는 방식을
익명함수(Anonymous function)
라고한다. - 변수에 할당하지 않고 사용하기 때문에, 외부에서의 접근을 막을 수 있다는 장점이 있다.
closure 활용
function tabsHandler(index) {
function tabClickEvent(evt) {
// Do stuff with tab.
// The index variable can be accessed from within here.
console.log("hi");
};
return tabClickEvent
}
var tabs = document.querySelectorAll('.tab'),
i;
for (i = 0; i < tabs.length; i += 1) {
tabs[i].onclick = tabsHandler(i);
}
- 위 코드처럼 각 tabHandler에서 전달된
i
값을 closure tabClickEvent에서 접근하여 원하는 결과를 얻을 수 있다. - 라고 많은 블로그 글들에서 설명해주고 있었다.
함수표현식이라고하면
let 함수 = function() {}
의 형태가 되어야 함수 표현식 아닌가? 대체 위 코드에 어디에서 위와같은 형태로 정의된 함수가 있는가?- 다시 한 번, 이런 저런 자료를 찾아본 결과
함수 표현식
은 단순히 함수를 정의하는 방법 자체를 넘어서 함수를객체
로 다루는 자바스크립트의 특성을 활용하여, 함수를 특정 변수값에 할당시키는 광범위한 표현식 자체를 말하는 것 같다. - 즉,
function tabClickEvent(evt)
자체는함수 선언식
이지만tabsHnadler
의 리턴값이 기본undefined
가 아닌tabClickEvent
라는함수
를 담고 있다는 점에서함수 표현식
이라고 할 수 있다.참고
- https://joshua1988.github.io/web-development/javascript/function-expressions-vs-declarations/