var test = "test";
function newFunction() {
var hello = "hello";
}
console.log(hello); // error: hello is not defined
hello는 함수 내에서만 사용가능하고 greeter는 전역 범위를 가지게된다.
함수 밖에서 hello를 찍어보면 함수 내부에서만 사용되기 때문에 정의되지 않았다는 에러가 발생
같은 범위 내에서는 똑같은 변수명으로 재선언이 가능하고 해당 변수값을 바꿔줄 수 있다.
var test = "var 선언";
var test = "var 재선언";
var test = "var 선언";
test = "var 업데이트";
console.log (greeter);
var greeter = "say hello"
위의 코드는 자바스크립트에서 아래의 코드로 해석됨
var greeter;
console.log(greeter); // greeter is undefined
greeter = "say hello"
greeter라는 변수가 먼저 선언되고 함수가 호출된다. 고로 변수 값은 나중에 저장되기 때문에 error가 발생
var greeter = "hey hi";
var times = 4;
if (times > 3) {
var greeter = "say Hello instead";
}
console.log(greeter) // "say Hello instead"
변수 greeter가 정의되어 있다는 것을 모를 시 값이 바뀌어버림 버그발생이 많음
블록은 {}로 바인딩 된것이다. 하나의 블록은 중괄호 속에서 존재하고 중괄호 안에 있는 것은 모드 블록 범위이다.
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
중괄호 안에서 hello를 선언하고 중괄호 밖에서 출력하니 에러가 발생
let greeting = "say Hi";
greeting = "say Hello instead"; // 값 업데이트 가능
let greeting = "say Hi";
let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared 재선언 불가
만약 다른 블록 범위에서 재선언 된다면 에러 발생 X
let greeting = "say Hi";
if (true) {
let greeting = "say Hello instead";
console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"
const greeting = "say Hi";
greeting = "say Hello instead";// error: Assignment to constant variable.
const greeting = "say Hi";
const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared
단 객체의 경우에서는 객체의 업데이트는 불가능하나 객체의 속성은 업데이트 가능하다.
const greeting = {
message: "say Hi",
times: 4
}
greeting = {
words: "Hello",
number: "five"
} // error: Assignment to constant variable.
greeting.message = "say Hello instead";
출처: https://www.freecodecamp.org/korean/news/var-let-constyi-caijeomeun/