Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

roadmap

8. 변수의 유효 범위(scope chain) 본문

web programming/JavaScript

8. 변수의 유효 범위(scope chain)

kdw_w 2020. 8. 7. 01:29

 

 

 

 

javascript 는 메모리 할당/해제를 자동으로 해주는 가비지 컬렉터를 사용한다.

앞서 말했다시피, 더 이상 해당 데이터를 참조할 수 없는 경우, 자동으로 메모리가 해제된다.

링크에서 자세한 메모리 해제 알고리즘도 볼 수 있다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management

 

자바스크립트의 메모리관리

메모리 생존주기는 프로그래밍 언어와 관계없이 비슷하다.

developer.mozilla.org

 

 

함수 내부에서 호출된 변수는 함수가 종료될 때, 그 메모리를 반환하고 사라진다

정적 변수는 별다른 조작이 없는 한, 계속 메모리를 차지한다

그러니 가능하면 로컬 변수를 사용하도록 하자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function showArray1(input) {
  for (i = 0; i < input.length; i++)
  {
    console.log(input[i]);
  }
}
function showArray2(input) {
  for (var j = 0; j < input.length; j++)
  {
    console.log(input[j]);
  }
}
 
var a = [12,3,4,5,6];
 
showArray1(a);
console.log('static value : ' + i);
showArray2(a);
console.log('static value : ' + j); // showArray2종료시 j는 해제 되었으므로 예외(오류)발생
 
cs

 

 

 

자바스크립트 변수의 유효범위는 실제로는 유효 범위 체인(scope chain)이라는 것과 관련이 있다

이 체인은 객체들의 연결이다. 아래의 코드를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var a = [12,3,4,5,6];
 
showArray1(a);
console.log('static value : ' + i);
showArray2(a);
console.log('static value : ' + j); // showArray2종료시 j는 해제 되었으므로 예외(오류)발생
 
function showArray1(input) {
  for (i = 0; i < input.length; i++)
  {
    console.log(input[i]);
  }
}
function showArray2(input) {
  for (var j = 0; j < input.length; j++)
  {
    console.log(input[j]);
  }
}
 
cs

 

이 코드는 처음 코드랑 완전히 동일하게 동작한다. 

실제로는 다음의 과정을 거친다.

 

자바스크립트 코드에서 변수 a를 찾으려면 먼저 전역 객체(Object)부터 검색을 시작한다.

만일 변수 a가 존재하지 않을 경우, 다음의 객체로 이동해 검색하는 것을 반복한다.

 

어떠한 함수도 없다면 단 하나의 객체(Object)만으로 이 유효 범위 체인(scope chain)이 이루어진다.

이 객체에서 모든 변수를 검색한다. 이 객체에 존재하지 않는 변수의 값은 undefined이다.

 

중첩되지 않은 함수는 유효 범위 체인은 두 개의 객체로 이루어진다.

첫 번째는 이 함수의 호출 객체이고, 두번째는 Object이다.

 

따라서 이 경우엔 아래 함수들부터 chain이 진행되어, 3번째줄 showArray1는 이미 chain 이후에 진행하게 된다. javascript에서는 함수(showArray1)는 단순한 함수가 아니라 데이터이므로 당연히 chaining이 이루어진다.

 

이것은 js의 중요한 특징이므로 나중에 포스팅하겠다.

 

 

 

 

 

 

'web programming > JavaScript' 카테고리의 다른 글

9. 프로토타입, 클래스, 인스턴스  (0) 2020.08.07
7. 예외 처리  (0) 2020.08.05
6. 배열  (0) 2020.08.05
5. 객체  (0) 2020.08.05
4. 값과 참조  (0) 2020.08.05