호이스팅
변수는
처음 인터프리터시점에서는 어떻게 되냐면,\
var a = 1;
이라는 코드를 보면
처음에
var a
이런 형태로 처음 인터프린터가 되고,
(그래서 저기를 처음에 찍어보면 undefined 가 나오는거다. 즉, undefined 로 할당이 되어나오는것 보다는 그냥 저런형태로 진행이 된다는것이다.)
그래서
그다음 순서에서
var a = 1;
값이 할당이 되는거다.
그리고
값은 바로바로 할당이 된다
즉,
var a -> var a = 1;
var b -> var b = 2;
이거순서는
일단 var a 가 첫번째
var b 가 두번째
var a = 1; 값할당 세번째
var b = 2; 값할당 네번째
만약 복잡하게
함수도 껴있고 하면,,,
console.log(a);
var a = 1;
function c(x1){
console.log(a1);
var a1 = 1;
console.log(a1);
};
var b = 2;
function d(x2){};
c();
d();
console.log(a);
<순서>
첫번째 var a 선언
두번째 function c 선언 하고
세번째 x1 대입
네번째 var b 선언
다섯번째 function d 선언 하고
여섯번째 x2 대입
일곱번쨰 맨위의 콘솔로그 console.log(a); // undefined
여덟번째 var a = 1; 값대입
아홉번째 var b = 2; 값대입
열번째 c(); 함수호출
열한번째 var a1 선언
열두번째 console.log(a1); //undefined
열세번째 var a1 = 1; 값대입
열네번째 console.log(a1); // 1
열다섯번째 d(); 함수호출,,함수종료
열여섯번째 아래 콘솔로그 console.log(a); // 1
끝.....
참고로 콘솔로그는 변수 함수 선언이 끝나고 바로실행되는것같음...
예를들어
console.log(v); // 2
var v = 1; // 1 3
console.log(v); // 4
이런코드가있으면 실행순서는
저 숫자 순서대로된다.
이게 호이스팅이다.
뭐 끌어올려지는게 아니고,
사실은 저렇게 되는거다.
또 예를들어
이순서는
c(); // 5
a(); // 7 //여기서 바로 코드 중단! 타입 에러!!!! 왜냐면 지금 7번째에서는 a()라는 함수가 없거든!!!그래서
즉, a함수라는 이름의 함수가 없고 , a라는 변수는 있지만!!!a()이라는 건 함수호출인데 a변수를 해야지 왜 함수로 적었냐하고, 너 지금 타입잘못적은거야 라고 알려주는셈이다.
console.log(b);
var b = 'qqq'; // 1
function c (){ // 2 3
console.log('x'); // 6
}
var a = function(){ // 4
console.log('ddd');
};
a();
console.log(b);
a();
c();
다른예제>
a();// 5 //함수 호이스팅
b();// 10 // 여기서 바로 타입에러 코드중단...현재 a함수의 v1변수의 로그 언디파인드랑 ㅇㅇㅇ 만 콜솔로그에 찍힌상태이다 .
에러나는 이유는 b함수를 못찾아서임.
console.log(v); //
var v = 'ㅇㅇ'; // 1
function a(){ // 2 3
console.log(v1); // 7
var v1 = 'ㅇㅇㅇ'; // 6 8
console.log(v1); 9
};
console.log(v); //
b();//
var b = function(){ // 4
console.log(v2); //
var v2 = 'ㅇㅇㅇㅇ'; //
console.log(v2); //
};
console.log(v); //
b(); //
console.log(b); //
이런식으로 순서가 된다....
또 다른예제>
a();// 5
console.log(v); // 10
var v = 'ㅇㅇ'; // 1
function a(){ // 2 3
console.log(v1); // 7
var v1 = 'ㅇㅇㅇ'; // 6 8
console.log(v1); // 9
};
console.log(v); // 11
var b = function(){ // 4 12
console.log(v2); // 16 20
var v2 = 'ㅇㅇㅇㅇ'; // 15 17
console.log(v2); // 18 21
};
console.log(v); // 13
b(); // 14
console.log(b()); // 19
21번을 마지막으로 함수종료후 코드가 끝남
이런식으로 순서가 된다....