var, let, const 를 중복 선언 허용, 스코프, 호이스팅 관점에서 서로 비교해 주세요.
함수 외부에서 선언될 때는 전역 범위
함수 블록 외부에서 var를 사용하여 선언된 모든 변수를 전체 윈도우 상에서 사용할 수 있음
함수 내에서 선언될 때는 함수 범위
해당 함수 내에서만 사용 및 접근 가능
var greeter = "hey hi";
function newFunction() {
var hello = "hello";
}
위 코드에서 hello
는 함수 범위, greeter
는 전역 범위
var tester = "hey hi";
function newFunction() {
var hello = "hello";
}
console.log(hello); // error: hello is not defined
hello
는 newFunction()
함수 밖에서 사용할 수 없으므로 에러 발생
같은 범위 내에서면 var
를 중복으로 선언하여 수정이 가능
var greeter = "hey hi";
var greeter = "say Hello instead";
var greeter = "hey hi";
greeter = "say Hello instead";
호이스팅이란 변수와 함수 선언이 맨 위로 끌어올려져 먼저 실행되는 자바스크립트 매커니즘
console.log (greeter);
var greeter = "say hello"
위 코드를 자바스크립트는 아래처럼 해석하여
var greeter; // 변수 선언이 맨 위로 호이스팅
console.log(greeter); // greeter is undefined
greeter = "say hello"
var
변수는 범위 내에서 맨 위로 올라가고, 값은 undefined
로 초기화
var greeter = "hey hi";
var times = 4;
if (times > 3) {
var greeter = "say Hello instead";
}
console.log(greeter) // "say Hello instead"
times>3
가 true
를 반환하여 greeter
는 "say Hello instead"
로 재정의 된다.
의도적으로 하지 않았을 경우 문제가 되기도 하고, 이런 var
의 특성은 많은 버그를 발생시킬 수 있기에 ES6에서 let
과 const
가 등장하게 되었다.
{}
로 바인딩된 코드 덩어리를 의미하며, 중괄호 안에 있는 것은 모두 블록 범위다.
let
으로 선언된 변수는 해당 블록 {}
내에서만 사용 가능하다.
let greeting = "say Hi";
let times = 4;
if (times > 3) {
let hello = "say Hello instead";
console.log(hello);// "say Hello instead"
}
console.log(hello) // hello is not defined
if문 안에서 선언된 hello
는 if문 블록 밖에서 사용할 수 없다.
let은 해당 범위에서 업데이트는 가능하지만, 재선언은 불가하다.
let greeting = "say Hi";
let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared
다른 블록 범위에서는 같은 이름의 변수를 선언할 수 있다.
var
처럼 let
선언은 맨 위로 호이스팅 되지만, var
와 다르게 undefined
로 초기화되지 않는다. 선언 이전에 let
변수를 사용하려 하면 Reference Error
가 발생한다.
let
과 동일
const
로 선언된 변수는 일정한 상수 값을 유지하기 때문에, 값을 변경할 수도 재선언할 수도 없다.
그렇기에 선언과 동시에 초기화가 되어야 한다.
const
개체는 업데이트할 수 없지만, 개체의 속성은 업데이트할 수 있다.
아래처럼 const
greeting
을 선언 및 초기화 했다면,
const greeting = {
message: "say Hi",
times: 4
}
아래처럼 greeting
객체의 속성을 직접 업데이트하는 것은 불가하지만,
greeting = {
words: "Hello",
number: "five"
} // error: Assignment to constant variable.
아래처럼 하는 것은 가능하다.
greeting.message = "say Hello instead";
let
처럼 const
선언도 맨 위로 호이스팅만 되고 초기화 되지는 않는다.
📌 scope : var는 전역/함수범위고 let과 const는 블록 범위다.
📌 업데이트/재선언 : var는 둘 다 가능하고 let은 업데이트만 가능하고 const는 둘 다 불가하다.
📌 호이스팅: 셋 다 최상위로 호이스팅 되지만, var 변수만 undefined로 초기화 된다.
📌 const만 선언과 초기화를 동시에 해야한다.