스코프

먼저 예제로 알아보자.

코드를 써보고 출력이 어떻게 되는지 본다.

위의 코드를 실행해보면 4번째줄 console.log(text)가 출력이된다.
하지만 바깥에 console.log(text)를 입력하면 어떻게 될까?

레퍼런스에러가 나온다.

첫번째 콘솔 출력 결과는 세번째 줄의 name중괄호(블록) 바깥에서 가져왔으므로 정상적으로 출력이된다.

그러나, 바깥에 따로 입력한 console.log(text)에서는 text라는 변수 자체가 중괄호(블록) 안쪽에서 선언되어 있으므로, 바깥쪽에서는 접근할 수 없다. 즉, 중괄호 안쪽에 선언되있는 변수는 바깥에서 안쪽으로는 가져올 수 있지만, 안쪽에서 바깥쪽으로는 못 가져간다는 의미이다.


다른예제로도 알아보자.

text 변수는 바깥에 정의되어 있으므로, 함수 안쪽에서 사용할 수 있다.
따라서 text변수와 firstName변수의 조합의 의해 'Hi Hyo' 문자열이 출력된다.
반면에, firstName 변수는 함수 안쪽에 정의되어 있으므로 함수 바깥쪽에서는 접근이 불가능하다.(안쪽에 있던걸 바깥으로 가져오는건 불가능) 따라서 RefereneceError를 낸다.

첫번째와 두번째 코드로 알아낼 수 있는것은 변수의 접근 범위이다.
첫번째 코드는 중괄호(블록)에 의해 나뉘어졌고, 두번째 코드는 함수에 의해 나뉘어졌다.
변수의 접근 범위중괄호(블록) 또는 함수에 의해 나뉘어지고, 그 범위를 스코프 라고 부른다.

바깥쪽 스코프에서 선언한 변수는 안쪽 스코프에서 사용가능함
반면에, 안쪽에서 선언한 변수는 바깥쪽 스코프에서 사용할 수 없다.


스코프의 정의와 규칙

스코프'변수 접근 규칙에 따른 유효 범위'이다.

첫번째 규칙은 안쪽 스코프에서 바깥쪽 스코프로는 접근할 수 있지만 반대는 불가능!

두번째 규칙은 스코프는 중첩이 가능하다.

세번째 규칙은 특별히 가장 바깥쪽의 스코프는 전역 스코프(Global Scope)라고 부르고, 전역이 아닌 다른 스코프는 전부 지역 스코프(Local Scope)라고 부른다.

네번째 규칙은 지역 스코프에 선언한 변수는 지역 변수, 전역 스코프에 선언한 변수는 전역 변수 이다.

또하나의 기억해야 할 규칙은, 지역 변수는 전역 변수보다 더 높은 우선순위를 가진다.

여기서 '지역 변수는 전역 변수보다 더 높은 우선순위를 가진다' 라는 규칙을 직접 확인해보자.

첫번째 출력은 첫째 줄에서 전역 변수로 선언된 name을 가져온다.
이는, showName함수 안쪽에 선언된 지역 변수 name은 애초에 스코프 규칙에 의해 접근할 수 없기 때문에 'hyo'를 출력!

두번째 출력은 함수 안에서 선언한 name이라는 지역 변수에 접근하고 있다. 변수 이름이 전역 변수와 같지만, 지역변수전역변수보다 우선순위가 높으므로 , 지역 변수 name이 출력된다.
동일한 변수 이름으로 인해 바깥쪽 변수가 안쪽 변수에 의해 가려지는(shadow) 이러한 현상을 쉐도잉(variable shadowing)이라고 부른다.
두번째 출력은 'woo'이다.

세번째 출력은 첫번째 출력과 마찬가지로 전역 변수 name을 출력한다.
지역변수에 선언된 name 변수는 안쪽 스코프이므로 접근이 불가능하다. 따라서 'hyo'를 출력!


지역 스코프에 새로 선언이 아닌 할당을 해보면?

만약 위의 코드 지역 스코프에서 새로 name 을 선언하는게 아닌, 그냥 할당하는 코드를 쓰면 어떻게 될까??

이전 코드와는 다르게 , 지역 스코프 안에서 변수를 새로 선언한게 아닌
name = 'woo'라고 할당을 써보았다.

이는, 'woo'라는 값으로 할당하고 있는 name변수는 전역에 선언된 name변수를 그대로 사용하겠다는 의미이다.

지역 스코프에서 새로 선언되지 않으면 그냥 같은 변수이다.

따라서 showName함수가 실행되기 전, 처음에는 'hyo'를 출력하고,
그 이후에는 전역변수 name의 값이 바뀌기 때문에 두번째 및 세번째 출력에 'woo'가 출력된다.

내용 정리

스코프에는 전역 스코프, 지역 스코프가 있다.

전역 스코프에 선언된 변수는 전역 변수,지역 스코프에 선언된 변수는 지역 변수 라고 한다.

스코프의 규칙으로는 안쪽 스코프에서 바깥쪽 스코프로는 접근이 가능, 반대로는 불가능 등등 이있다.

지역스코프에 변수 선언이 아닌 할당을 하였을 시 값이 다르다.

profile
개발 재밌다

0개의 댓글