js 의 회수 메커니즘 이 어떻게 된 일 인지 다시 한 번 설명 하 다.

2979 단어
며칠 전의 폐쇄 적 인 글 에서 우 리 는 폐쇄 적 인 것 을 간단하게 소 개 했 지만 깊이 설명 하지 않 았 다. 폐쇄 적 인 것 과 관련 된 지식 이 비교적 많 기 때문에 폐쇄 적 인 것 을 잘 이해 하기 위해 오늘 은 js 중의 회수 체제 에 대해 설명 한다.
처음 보 는 폐쇄 문 에서 제 가 js 에 회수 체제 가 있다 고 말 했 습 니 다. 우리 함께 돌 이 켜 보고 js 중의 회수 체제 가 어떻게 된 일 인지 깊이 이해 합 시다.
function a(){
  var num = 10;
  return function(){
    num ++;
    console.log(num);
  }
}
a()(); //11
a()(); //11

이치 대로 말 하면 두 번 째 함수 a 를 실행 할 때 12 를 출력 해 야 하 는데 인쇄 한 것 은 11 입 니 다. 이것 은 js 가 그 중에서 무슨 짓 을 했 는 지 설명 할 수 없 습 니까?정상 적 인 논리 에 따라 우리 함께 분석 분석 합 시다.
 
우선 우리 의 이 해 를 살 펴 보 자.
/ / 우 리 는 함수 a 에서 익명 함 수 를 되 돌려 주 었 습 니 다. 이 익명 함수 에서 num + + 를 한 다음 에 함수 밖에서 이 익명 함수 함 수 를 실 행 했 습 니 다. (첫 번 째 괄호 실행 함수 a 두 번 째 괄호 는 이 rutrun 이 돌아 가 는 함 수 를 실 행 했 습 니 다)
/ / 지금 num 은 11 입 니 다. 그리고 우 리 는 이 함 수 를 다시 한 번 실 행 했 습 니 다. 당신들 은 12 일 것 입 니 다. 왜 그렇지 않 습 니까?
실제 js 의 집행
그러나 js 의 디자이너 는 불필요 한 변 수 를 메모리 에 저장 하기 위해 (우리 가 쓴 모든 변 수 는 메모리 공간 이 필요 합 니 다) 불필요 한 변 수 는 무엇 입 니까?즉, 당신 이 이 변 수 를 필요 로 하지 않 을 때 그것 은 소각 된다 는 것 입 니까?그럼 그 변수 들 이 우리 가 필요 로 하지 않 는 것 이 고 우리 가 필요 로 하 는 것 이 무엇 인지 js 에 게 물 어 볼 것 이다.그래서 js 는 어떤 변 수 를 저장 해 야 하 는 지, 어떤 변 수 를 저장 하지 않 아 도 되 는 지 판단 합 니 다.다음은 제 이 스 가 어떻게 판단 하 는 지 보 자.
1. js 에서 정의 하 는 전역 변 수 는 소각 되 지 않 습 니 다. 우 리 는 언제든지 이 변 수 를 사용 할 수 있 기 때문에 소각 되 지 않 습 니 다.
2. 그러나 함수 에 정 해진 변 수 는 일정 하지 않 습 니 다. 또한 함수 에 정 의 된 변수의 생명 주기 가 이 함 수 를 실행 하고 소각 하 는 원인 으로 인해 지난번 의 값 을 저장 할 수 없습니다.
2.1 그러나 함수 가 지난번 의 값 을 저장 하지 못 한 다 는 것 은 아니다. 어떤 때 는 우리 가 지난번 의 값 이 필요 하기 때문에 js 는 지난번 변수의 값 을 저장 해 야 하 는 지 판단 할 때 이런 규칙 을 준수 한다.
규칙.
이 함수 가 외부 변수 에 의 해 인용 되면 소각 되 지 않 습 니 다.이 말 을 어떻게 이해 하지?
function a(){
    var b = 0;
    return function(){
        b ++;
        console.log(b);
    }
}

var d = a();
d();//1
d();//2

 함수 a 는 변수 d 에 의 해 인용 되 었 습 니 다. 더욱 정확 한 것 은 함수 a 안의 익명 은 변수 d 에 의 해 인용 되 었 습 니 다. 변수 d 는 함수 a 가 실 행 된 후의 값 과 같 기 때문에 함수 a 가 실 행 된 후에 함수 a 가 그 익명 함 수 를 되 돌려 주 었 기 때문에 정확 한 것 은 변 량 d 는 익명 함수 와 같 습 니 다.이 익명 함 수 는 함수 a 의 변수 b 를 사 용 했 고 변수 d 에 의 해 인용 되 었 기 때문에 하나의 패 킷 이 형성 되 었 습 니 다. 이 변수 d 가 null 과 같 지 않 으 면 그 변수 b 는 변수 d 에 저장 되 어 소각 되 지 않 습 니 다.
요약:
1. 한 대상 이 인용 되 지 않 으 면 이 대상 은 GC 에 의 해 회수 된다.2. 만약 에 두 대상 이 서로 인용 하지만 세 번 째 대상 에 의 해 인용 되 지 않 으 면 이 두 대상 도 회수 된다.
패 킷 을 더 깊이 배우 고 싶다 면 for 순환 에서 이벤트 인쇄 변수 i 를 연결 하 는 것 이 마지막 문제 라 는 글 을 보 는 것 을 추천 합 니 다.

좋은 웹페이지 즐겨찾기