var a = 1
var name = "euni"
var age = 10
console.log(age)
위와 같은 코드를 실행한다고 가정할 때,
함수가 실행되기 전에 안에있는 변수들을 범위의 최 상단으로 끌어올리는 것을 호이스팅이라고 한다.
// 문제되지 않는 코드 예시
var a = 1
console.log(a)
// 실행결과
1
// 호이스팅의 개념이 적용된 코드 예시
console.log(a) // a를 선언하기 전에 변수 a를 사용하고 있음
var a = 1
console.log(a)
// 실행결과
undefined
1
코드는 항상 Top to bottom 이기 때문에 위에서 아래로 실행되지만, js의 경우 호이스팅으로 처리되기 때문에 a를 선언하기 전에 a변수를 사용하여도 에러가 나지 않는것을 볼 수 있다.
undefined
이와같이 동작하는 이유는,
console.log(a) // undefined
a = 1 // 선언 안함
var a // 선언을 할당 뒤에 함
console.log(a) // 1
// var로 선언된 b가 지역변수로 적용됨
var a = 2
function foo() {
var b = 1
}
console.log(b) // referenceError: b is not defined at ...(생략)
// var로 선언된 전역변수로 적용됨
for(var i=1; i<5; i++) {
console.log(i) // 1,2,3,4..(순서대로 출력)
}
console.log(i) // 지역변수를 전역에서 사용해도 에러가 나지 않음
또한가지, 말도 안되는 상황은 중복에서 같은 변수명을 사용했을 때이다.
var a = 1
console.log(a) // 1
var a = 2
console.log(a) // 2
이에 따라, 새로운 변수 사용방법이 등장하게 된다.
자바스크립트는 var를 지양하고 let을 사용하도록 권장한다.
console.log(a) // a라는 변수를 자바스크립트 엔진이 알고 있음
let a = 1 // 그러나 a 선언문이 나오기 전까지는 a에 접근하지 않는다.
console.log(a)
// 결과
Cannot access 'a' before initialization
결론: let을 써라~
// 예시로
5-'3'
과 같은 코드가 실행가능함