오늘은 스코프에 대해 내용 정리를 해보려고 합니다. 모든 언어에서 기본이되는 개념이므로 중요합니다.
변수가 유효되는 범위를 뜻한다.
선언 키워드 - var, let, const

전역 스코프 - 코드 어디에서든지 참조할 수 있다.
지역 스코프 - 함수 코드 블록이 만든 스코프로 함수 자신과 하위 함수에서만 참조할 수 있다.
전역 변수 - 전역에서 선언된 변수이며 어디에든 참조할 수 있다.
지역 변수 - 지역(함수) 내에서 선언된 변수이며 지역 안에서만 참조할 수 있다.
global 부분이 전역 scope 부분이 지역이다.
유효 범위의 경계를 조건문, 반복문을 포함한 {}(중괄호)로 할지, 함수 코드 블럭으로 할지의 차이입니다.

let과 const는 블록, 함수 스코프를 가질 수 있다. 그리고 함수 외부에서는 참조 할 수 없다.

var은 함수 스코프만 가진다. 블록스코프는 무시를 한다.
식별자를 찾을 때, 자신이 속한 스코프에서 먼저 찾고, 자신이 속한 스코프에 없다면 상위스코프에서 다시 찾아나간다.

q1함수에서 a값이 없어서 전역변수에 있는 a값인 global을 가져옵니다.
q2함수에서는 a값이 local로 할당 되어 있기에 local이 출력됩니다.

a 변수에 a를 할당하여 콘솔을 찍었으니 a값이 나올 것입니다.

a라는 변수가 out부분에도 있고 inner 부분에도 있습니다. 결과는 a2가 찍히게 됩니다.
그 이유는 특정 함수에서 변수를 선언해주면 스코프가 생성이 됩니다.
컴퓨터는 a는 'a'였는데 a가 'a2'가 있네? 하면서 a2를 반환해주는것 입니다.

이 부분을 보시면 out2를 생성했는데요 inner부분에 콘솔로 b를 넣어놨습니다. 결과는 오류가 나오죠
이렇듯 내부 inner함수가 외부 out함수와 묶여 있는 것을 의미합니다.
식별자를 찾을 때까지 상위로 이동하는 이러한 현상을 스코프 체이닝 이라고 하며,
식별자를 결정할 때 활용하는 스코프들의 연결리스트를 스코프 체인 이라고 한다
함수를 어디서 선언하였는지에 따라 상위 스코프를 결정하는 것 입니다.

위에 사진을 보면 q2가 q1 안에서 호출이 되었기 때문에 지역변수인 a ='a'값을 참조 할 거 같지만,
전역 변수인 a = 'ayo'를 참조하게 됩니다.
q2는 전역에 생성되어 있기에 상위스코프는 전역 스코프가 되기 때문에 ayo값이 출력되게 됩니다.
만약 q2에 변수를 선언해서 사용했다면 결과 값이 q2의 변수값이 나오겠죠.