var, let, const 비교
기존 자바스크립트의 변수 선언 키워드 var
과 ES6에서 새롭게 도입된 변수 선언 키워드 let
과 const
에 대해서 알아보자.
var 키워드를 붙이지 않으면 어떻게 될까?
먼저 var
에 대해서 알아보자. var
는 키워드 없이 변수를 선언하면 전역 변수가 된다. 전역 유효범위에 속해지기 때문에 코드 내에서 어디서든 변수에 접근할 수 있게 되는 것이다.
1 | function checkscope(){ |
위의 예제에서 var
키워드를 사용하여 선언한 변수인 name
은 checkscope
라는 함수 안에서의 지역변수이다. 하지만 var
키워드를 사용하지 않고 선언한 변수인 name2
는 전역변수이다.
따라서 함수 밖에서 checkscope()
와 checkscope2()
함수를 호출한 후, name
과 name2
를 출력하면 name2
의 값인 global
만 출력되는 것을 확인할 수 있다.
변수 name
은 함수의 지역변수이기 때문에 함수 밖에서는 사용할 수가 없지만 name2
는 var
키워드를 붙이지 않아서 전역 변수가 되었기 때문에 함수 밖에서도 사용할 수 있다.
Function-Scoped / Block-Scoped
var는 function-scoped이고, let과 const는 block-scoped이다.
var는 function-scoped
먼저 아래의 예시를 살펴보자.
Example1
1 | for(var i=0; i<10; i++) { |
Example2
1 | var i; |
var i
가 hoisting 되기 때문에 위의 Example1과 Example2는 동일한 코드라고 보면 된다. 따라서 i
는 for
문 밖에서도 사용할 수 있는 전역변수인 것이기 때문에 after loop i is 10
라는 문장이 정상적으로 출력이 된다. (참고로, 호이스팅에 대한 내용은 여기에서 볼 수 있다.)
하지만 아래의 예시에서는 에러가 발생한다. Example3과 Example4는 동일한 코드라고 보면 되는데, Example3에서 선언된 변수가 포함된 scope 내에서 가장 위로 호이스팅 된 것이 Example4이다. 그런데 이 var i
는 counter
라는 함수 내에 존재하기 때문에, 함수 밖에서는 이 i
라는 변수를 사용할 수가 없다.
Example3
1 | function counter() { |
Example4
1 | function counter() { |
Example1~4를 다시 살펴보자. 왜 Example1에서는 전역에서 i
에 접근할 수 있고 Example2에서는 전역에서 i
에 접근할 수 없는가?
var
키워드가 function-scoped이기 때문이다!
변수 선언문이 호이스팅될 때 해당 scope의 가장 위로 호이스팅되는데, Example1에서는 변수 선언문이 함수 안에 포함되어 있지 않아서 전역으로 호이스팅되는 것이고, Example3에서는 변수 선언문이 함수 안에 포함되어 있기 때문에 함수 안에서 가장 위로 호이스팅 된다.
var
키워드를 사용하지 않으면?
앞에서 var
키워드를 사용하지 않으면 전역 변수가 된다고 했다. 따라서 아래와 같이 전역에서 i
에 접근할 수 있기 때문에 after loop i is 10
라는 문장이 정상적으로 출력된다.
아래의 Example5와 Example6는 동일한 코드라고 보면 된다.
Example5
1 | function counter () { |
Example6
1 | var i; |
var / let / const
var
는 재선언과 재할당 모두 가능let
은 재선언 불가능, 재할당 가능const
는 재선언과 재할당 모두 불가능
var는 재선언 가능
1 | var a = 'hello'; |
var는 재할당 가능
1 | var b = 'hello'; |
let은 재선언 불가능
1 | let c = 'hello'; |
let은 재할당 가능
1 | let d = 'hello'; |
const는 재선언 불가능
1 | const e = 'hello'; |
const는 재할당 불가능
1 | const f = 'hello'; |