실행 환경은 변수 또는 함수가 액세스 할 수있는 권한이있는 다른 데이터를 정의하고 해당 동작을 결정합니다. 각 실행 환경에는 이와 관련된 가변 객체가 있습니다.
글로벌 실행 환경은 가장 주변 실행 환경입니다. JavaScript 구현이 위치한 호스트 환경에 따라 실행 환경을 나타내는 객체도 다릅니다. 웹 브라우저에서 글로벌 실행 환경은 창 객체로 간주됩니다. 따라서 모든 글로벌 변수 및 함수는 창 객체의 속성 및 방법으로 생성됩니다.
가변 객체 : 환경에 정의 된 모든 변수 및 함수는이 객체에 저장됩니다.
스코프 체인 : 코드가 환경에서 실행되면 가변 객체의 스코프 체인이 생성됩니다. 범위 체인의 목적은 실행 환경에 액세스 할 수있는 권한이있는 모든 변수 및 기능에 순서대로 액세스 할 수 있도록하는 것입니다. 스코프 체인의 프론트 엔드는 항상 실행 된 코드가 위치한 환경에서 항상 가변 객체입니다.
활성 객체 : 활성 객체에는 처음에는 하나의 변수, 즉 인수 객체 만 포함됩니다. 스코프 체인의 다음 변수 객체는 포함 (외부) 환경에서 비롯되며 다음 변수 객체는 다음 포함 환경에서 비롯됩니다. 이것은 글로벌 실행 환경에 계속됩니다. 글로벌 실행 환경의 가변 객체는 항상 스코프 체인의 마지막 객체입니다.
식별자 구문 분석 : 식별자 구문 분석은 스코프 체인을 따라 식별자를 하나씩 검색하는 프로세스입니다. 검색 프로세스는 항상 스코프 체인의 프론트 엔드에서 시작한 다음 식별자가 발견 될 때까지 단계적으로 다시 돌아갑니다.
샘플 코드 :
var color = "blue"; function changecolor () {if (color === "blue") {color = "red"; } else {color = "blue"; }} changecolor (); alert ( "색상은 이제" + 색상);함수 changecolor ()의 스코프 체인에는 자체 변수 객체 (인수 객체를 정의하는)와 글로벌 변수의 변수 객체의 두 가지 객체가 포함됩니다. 이 스코프 체인에서 찾을 수 있으므로 변수 색상은 함수 내부에 액세스 할 수 있습니다.
또한 로컬 스코프에 정의 된 변수는 로컬 환경에서 글로벌 변수와 상호 교환 적으로 사용될 수 있습니다.
var color = "blue"; function changecolor () {var exercolor = "red"; 함수 swapcolors () {var tempcolor = 다른 콜러; 다른 콜러 = 색상; color = tempcolor; // 여기에서 색상, 다른 콜러 및 템플러에 액세스 할 수 있습니다} // 여기에서 색상 및 다른 검색에 액세스 할 수 있지만 TempColor SwapColors ()에 액세스 할 수는 없습니다.} // ColorChangeColor ()에만 액세스 할 수 있습니다.위의 코드에는 3 가지 실행 환경, 즉 글로벌 환경, changecolor ()의 핸들 환경 및 SwapColors ()의 로컬 환경이 포함됩니다.
글로벌 변수에는 가변 색상과 함수 changecolor ()가 있습니다. changecolor ()의 로컬 변수에는 변수 다른 검색기와 함수 swapcolors () 함수가 포함되어 있으며, 이는 전역 변수의 색상에 액세스 할 수 있습니다. SwapColors ()의 로컬 변수에는 가변 온도가 있습니다. SwapColors ()에서는 두 가지 환경이 상위 실행 환경이기 때문에 글로벌 변수 또는 기타 콜러 변수의 색상에 액세스 할 수 있습니다. 위의 예의 범위 체인은 다음과 같습니다.
그중에서도 내부 환경은 스코프 체인을 통해 모든 외부 환경에 액세스 할 수 있지만 외부 환경은 내부 환경의 변수와 기능에 액세스 할 수 없습니다 . 환경 변수 간의 연결은 선형적이고 순차적입니다. 각 변수는 쿼리에서 변수 및 함수 이름을 쿼리하는 것까지 스코프 체인을 검색 할 수 있습니다. 즉, 먼저이 함수의 변수 또는 함수 이름을 쿼리하고 상단 스코프까지 이전 스코프 체인으로 쿼리되지 않은 경우. 그러나 어떤 환경도 스코프 체인을 검색하고 다른 실행 환경에 들어갈 수 없습니다.
함수 매개 변수도 변수로 취급되므로 액세스 규칙은 실행 환경의 다른 변수와 동일합니다.
1. 스코프 체인을 확장합니다
실행 흐름이 다음과 같은 진술 중 하나를 입력하면 스코프 체인이 확장됩니다.
• Try-Catch 문의 블록을 잡으십시오
• 성명서와 함께
이 두 문장은 범위의 프론트 엔드에 가변 객체를 추가합니다.
with 문의 경우 지정된 변수가 스코프 체인에 추가됩니다. Catch 문의 경우, 새로운 변수 객체가 만들어지며, 여기에는 잘못된 객체의 선언이 포함되어 있습니다.
예를 들어:
함수 buildUrl () {var qs = "? debug = true"; (위치) {var url = href + qs; } return url;}with 문은 위치 객체를 수신하므로 변수 객체에는 위치 객체에서 사용되는 속성과 메소드가 포함 되며이 변수 객체는 스코프 체인의 프론트 엔드에 추가됩니다. with 문의 변수 href (실제로 location.href)에서 변수 href를 참조하면 현재 환경 변수에서 찾을 수 있습니다. 변수 QS를 참조 할 때, buildUrl ()에 정의 된 변수가 참조되며, 이는 기능 환경 변수 객체에 위치합니다. with 문의 경우 URL이라는 변수가 정의되므로 URL은 기능 실행 환경의 일부가되어 함수 값으로 리턴 될 수 있습니다.
2. 블록 레벨 범위가 없습니다
JavaScript에서 동봉 된 곱슬 괄호는 그들 자신의 범위가 없습니다. 다음 코드를보십시오.
if (true) {var color = "blue";} alert (color); // "파란색"JavaScript에서 if/for 문에 의해 생성 된 변수 선언은 현재 실행 환경에 변수를 추가합니다. 예를 들어:
for (var i = 0; i <10; i ++) {dosomething (i);} alert (i); // 10쓰레기 재활용
Java와 마찬가지로 JavaScript에는 자동 쓰레기 재활용 메커니즘이 있습니다. 실행 환경은 코드 실행 중에 사용되는 메모리 관리를 담당합니다. 프로그램을 작성할 때 관련 메모리 사용량 문제가 필요하지 않습니다. 필요한 메모리의 할당과 쓸모없는 메모리의 재활용이 완전히 구현됩니다. 쓰레기 수집 메커니즘의 원리는 다음과 같습니다. 더 이상 사용되지 않는 변수를 찾은 다음 점유하는 메모리를 자유롭게합니다. 이를 위해 쓰레기 수집기는 고정 시간 간격 (또는 코드 실행 중에 미리 정해진 수집 시간) 으로이 작업을 주기적으로 수행합니다.
쓰레기 수집을하기 전에 자원이 쓸모없고 앞으로 메모리를 재활용하기 위해 더 이상 사용되지 않는 변수를 표시해야합니다. 쓸모없는 변수를 식별하기위한 전략의 두 가지 구현이 있습니다.
1 마크 클리어
JavaScript에서 쓰레기 수집을위한 가장 일반적인 방법은 마커 청소입니다. 변수가 환경에 들어가면 "환경에 들어가는"것으로 표시됩니다. 가변이 환경을 떠나면 "환경 출구"로 표시됩니다. 쓰레기 수집기가 실행되면 사용 된 모든 변수를 표시합니다. 그런 다음 환경의 변수 태그와 환경의 변수에 의해 참조 된 변수를 제거합니다. 그 후, 태그 변수는 삭제 될 준비가 된 변수로 간주됩니다. 마지막으로, 쓰레기 수집기는 메모리 청소 작업을 완료하고 표시된 값을 파괴하고 그들이 차지하는 메모리 공간을 재활용합니다.
2. 참조 수
참조 수는 각 값이 참조되는 횟수를 나타냅니다. 변수가 선언되고 기준 유형 값이 변수에 할당 될 때,이 값에 대한 참조 수는 1입니다. 동일한 값에 대해 다른 변수에 할당되면 값에 대한 참조 수가 1만큼 증가합니다. 반대로,이 값에 대한 참조를 포함하는 변수가 다른 변수에 의해 참조 수가 감소하면,이 값의 숫자가 다시 감소합니다. 메모리 공간을 되 찾을 수 있습니다. 다음에 쓰레기 수집가가 실행될 때,이 값은 제로 참조로 이러한 값을 차지하는 메모리를 재활용합니다.
참조 계산이 재활용 된 참조를 유발할 수있는 한 가지 문제가 있습니다. 예를 들어:
함수 문제 () {var obja = new Object (); var objb = new Object (); obja.someotherobj = objb; objb.someotherobj = obja;}위의 예에서 OBJA와 OBJB는 속성을 통해 서로를 참조하십시오. 함수 실행이 완료되면 OBJA 및 OBJB는 계속 존재하며 참조 수는 0이 아닙니다.이 상황으로 인해 OBJA와 OBJB가 점유 한 메모리가 재활용됩니다.
위의 기사는 JavaScript에 대해 간단히 이야기합니다. 실행 환경, 범위 및 쓰레기 수집은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.