본문 바로가기

개발 일기

[Javascript] hoisting을 방지하기 위해서 function declaration보다 function expression을 활용하는 게 나을까?

아니 팡ㅡ션에는 이름이 있어야 하지 않겠읍니까 모름지기...? 하물며 엑셀 팡션에도 이름이 있는데 왜 자바스크립트에 이름을 지정하지 않고 사용할 수 있는 함수가 있는 걸까요,,, 왜 함수에 이름을 지정하지 않고 쓰는 것이죠? 그러면 해당 함수를 나중에 쓰려고 할 때는 어떻게 찾는거지...? 

 

위의 의문들을 해결하기 위해 일단 구글링과 코드카데미 강의를 듣고 올 예정

 

A function expression is often stored in a variable in order to refer to it. 그러니까 const든 let이든 어떠한 변수 안에 function expression이 저장된다는 말인 것 같은데 function expression이 정확히 뭔지 그새 까먹음^^... function expression 다시 구글링 하고 와야겠다

 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function

 

Function expression - JavaScript | MDN

The function keyword can be used to define a function inside an expression.

developer.mozilla.org

유용한 링크가 있길래 일단 아카이빙 차 가져왔다. 하지만 여기서도 내가 원하는 답은 찾을 수 없었는데...

 

https://joooing.tistory.com/entry/%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8%EC%8B%9DFunction-Declarations-%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9DFunction-Expressions%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

함수 선언식(Function Declarations), 함수 표현식(Function Expressions)의 차이점

function function은 독립적으로 분리된 로직으로서 프로그램 수준에서 미리 정의되어 있거나 사용자정의에 의해 만들어진 실행단위를 일컫는 말이다. 자바스크립트의 function은 Fisrt-Class-Object 로서

joooing.tistory.com

여기서 function expression이 뭔지 찾을 수 있었다! function expression은 한국어로 함수 표현식으로, function declaration과 구분을 해야 한다고 한다. function declaration은 뭔지 안다! 함수를 선언하는 식인데, 이것과 expression이 어떻게 다른 걸까? 

 

위의 엄청난 분이 써 주신 바에 따르면 function declaration은 그 유명한 hoisting이 가능하다. 실행을 먼저 하고 선언을 해도 hoisting에 의해 정상 작동 한다는 말...! hoisting이 정확히 실무에서 어떻게 받아들여지는지는 모르겠지만 난 일단,,, 실행을 먼저 하고 선언을 해도 정상 작동한다는 개념 자체가 너무 싫다,,, 이치에 어긋나,,,

 

아하! 반면 function expression은 함수 자체가 특정 변수에 할당되는 것을 뜻하는 것 같다.  그러니까...

const A = function(B) {
	console.log(`${B}`);
};

지금 대충 써 본 건데, 요런 식으로 함수가 변수에 할당되어서 함수의 실행과 그 결과값까지 포함할 때 function expression이라고 불린다고 한다! 그렇다면 hoisting을 방지하기 위해서는 덜렁 선언만 하는 것보단 expression으로 만들어 주는 게 낫지 않을까 하는 생각을 해 보았다(왜냐하면, expression은 호이스팅이 불가함). 맞는지 틀리는지는 모름,,,

 

아무튼 오늘도 하나의 궁금증이 해결되었따. 더 궁금한 점은 개발자분께 물어보든지 하는 것으로...ㅎㅎ 나중에 보고 해결하려고 궁금증을 제목으로 남겨 두었다