
위의 코드를 한 번 보면 let 을 이용해서 name 이라는 변수안에 처음에는 david 라는 값을 넣었고
그걸 console.log 를 통해 name을 출력하니 david 라는 값이 나온 것을 볼 수 있다.
그리고 그 밑에 name 이라는 변수에 다시 hello 라는 값을 넣었고 다시 console.log를 통해서 name 출력하니
david가 아닌 hello가 나온 것을 볼 수 있는데 각 변수마다 한개의 값을 가질 수 있는 데이터 박스가
존재한다고 생각하면 쉽다.
맨 처음에 name 이라는 변수 안에 david 를 넣었을 때 박스에 david 라는 물건을 넣었고
당연히 그걸 열어봤을 때에는 david가 들어있는거라고 생각하면 되는데
그 박스에 david를 빼고 hello 라는 물건을 다시 넣었다고 생각하면 쉽다.

자 그럼 여기에서는 위와 차이가 있다면 맨 위와 맨 아래에 {} 를 쓴 것을 볼 수 있다.
이것을 block scope 라고 하는데 이 block scope 안에 작성한 코드를 작성하면
그 밖에서는 block scope 안에 작성한 코드를 볼 수가 없다.
즉, 다시 변수를 정해주지 않는 이상 같은 변수 이름으로 출력만 하면 출력이 안된다.
그 예는 오른쪽 사진을 보면 아는데 block scope 안에 let name = 'hello' 라고 변수에 값을
넣어줬지만 block scope 밖에서 이 name 을 출력하려고 하니까 에러가 떴다.
위와 같이 block scope 안에 작성한 코드들을 그 밖에서는 출력을 하려고 해도 못한다고 보면 된다.
(block sope 안에 쓴 console.log(globalName)은 무시하자.... 있는지도 몰랐다...)

(codepen 에서는 아무것도 없는 것을 출력하게 되면 빈 화면이 아닌 CodePen이 나온다.)
근데 여기에서 global scope 라는 것도 있게 되는데 global scope는 block을 안쓰고
파일 안에 바로 정의해서 쓰는 변수들을 global scope 라고 부른다.
global scope는 어느 곳에서나 접근이 가능하다.
그렇기 때문에 block 안에서나 밖에서나 출력이 되는 모습을 볼 수 있는데 이것이 무한으로
사용할 수 있는 변수면 좋겠지만 그건 아니다.
어플리케이션이 실행되는 순간부터 끝나는 순간까지 항상 메모리에 탑제가 되어있기 때문에
최소한으로 사용하는게 좋고 가능하면 class 나 함수 if 나 for 등 필요한 부분에서만
정의해서 사용하는게 좋다고 한다.
자바스크립트에서 변수를 정의할 수 있는 것은 딱 하나 let 이라고 한다.
let 은 ES6에 추가가 되었다고 한다.
이전에는 var를 사용을 했는데 var를 사용하면 안좋은 이유는
대부분 프로그래밍에서는 변수를 선언하고 나서 값을 할당하는게 정상적이지만
var 에서는 선언전에 값을 할당을 할 수 있고 그 값을 할당하기 전에도 출력이 가능하다고 한다.

예를 들면 위의 사진과 같다.
undefined 라고 뜬 건 age = 4; 위에 console.log 로 출력된거고
그 밑에 4라고 뜬건 age = 4; 라고 정해줬기 때문에 age값인 4가 출력이 된거다.
근데 우리가 일반적으로 알고 있는 변수 선언 후 값 할당 후 출력과는 순서가 상당히 다른 것을
알 수 있는데 이게 var 로 선언하게 되면 이렇게 출력이 가능하다.
이것을 var hoisting 이라고 하는데 이 hoisting은 어디에 선언했냐에 상관 없이 항상
제일 위로 선언을 끌어올려주는 것을 뜻하는 것이라고 볼 수 있다.
그리고 var는 {} 인 block scope 를 무시하는 친구라고 하는데 원래 block scope를 쓰면
그 밖에서 출력을 요청 했을 때 출력이 되면 안되는데 var를 쓰게 되면 block scope를 무시하고
출력이 된다고 한다.
'JavaScript' 카테고리의 다른 글
| JavaScript(자바스크립트) - Function 함수에 대해서 알아보자 (0) | 2022.08.11 |
|---|---|
| JavaScript(자바스크립트) - 연산과 반복문 if, for , while 알아보기 (0) | 2022.08.11 |
| JavaScript(자바스크립트) - async / defer 에 대해서 알아보기 (0) | 2022.08.11 |
댓글