호이스팅 정리 본문
자바스크립트의 큰 특징중 하나라고 할 수 있는 호이스팅에 대해 포스팅하겠습니다.
호이스팅은 '특정 실행 컨텍스트(scope)안에서 선언된 변수 이름과 함수 선언 내용을 해당 실행 컨텍스트 최상단에 올려놓는 것'이라고 할 수 있습니다.
아래 코드에서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var a = 1; var outer = function() { var inner = function() { console.log(a); var a = 3; } inner(); console.log(a); } outer(); console.log(a); | cs |
출력은 undefined, 1, 1 이 됩니다. inner 함수 안에서 undefined가 뜨는 이유가 바로 호이스팅 때문인데요, 전역으로 a라는 변수가 선언되어있음에도 불구하고 같은 실행 컨텍스트(inner 함수)에 선언된 변수 a를 호이스팅하여 우선적으로 찾게 됩니다.
중요한것은 변수는 호이스팅 될 때 이름만 호이스팅 되고, 할당 된 내용은 같이 호이스팅이 되지 않는다는 것입니다.
하지만 함수 선언문으로 작성된 함수는 함수 이름 뿐만 아니라 선언된 함수 내용까지 같이 호이스팅이 되는데요,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function sum(x, y) { return x+y; } var outer = function() { var inner = function() { console.log(sum(10,20)); function sum(x, y) { return x*y; } } inner(); console.log(sum(10,20)); } outer(); console.log(sum(10,20)); | cs |
따라서 이 코드의 출력은 200, 30, 30 이 됩니다.
반면에 함수 표현식으로 작성 된 아래 코드에서는 inner 함수 안의 sum 함수의 이름만 호이스팅이 되고 해당 함수의 내용은 호이스팅 되지 않아 에러를 띄우는 것을 확인 할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var sum = function(x, y) { return x+y; } var outer = function() { var inner = function() { console.log(sum(10,20)); var sum = function(x, y) { return x*y; } } inner(); console.log(sum(10,20)); } outer(); console.log(sum(10,20)); | cs |
호이스팅은 var 선언인 경우 또는 함수 선언문인 경우 에만 적용이 됩니다. 따라서 아래와 같은 let 선언에서는 에러가 나게 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var a = 1; var outer = function() { var inner = function() { console.log(a); let a = 3; } inner(); console.log(a); } outer(); console.log(a); | cs |
호이스팅은 굉장히 편하기능이지만, 또한 굉장히 헷갈립니다. 특히 규모가 커져 복잡해질수록 호이스팅으로 인한 에러에 주의해야 합니다.
'Javascript' 카테고리의 다른 글
자바스크립트 Date Format 변경 하기 (0) | 2020.09.29 |
---|---|
자바스크립트 클로저 (0) | 2020.09.25 |
자바스크립트 콜백 함수 (0) | 2020.09.21 |
함수 선언문과 함수 표현식 (0) | 2020.09.19 |
Node.js와 DB 연동하기 (0) | 2020.09.18 |
Comments