범위, 범위 체인, 실행 환경, 실행 환경 스택의 개념은 JavaScript에서 매우 중요하며 종종 혼동됩니다.
로컬 범위 함수 내부 영역, 전역 범위는 창입니다.
범위 체인은 함수가 선언된 위치에 따라 식별자를 구문 분석할 때 현재 범위가 먼저입니다. 그런 다음 전 세계까지 검색합니다. 이러한 순서는 함수가 호출되는 위치와 관련이 없습니다.
실행 환경은 액세스할 수 있는 데이터 및 변수의 모음입니다. 함수의 범위인 함수
실행 환경 스택은 코드 실행 순서에 따라 계층별로 액세스됩니다. 현재 실행 환경(현재 범위 체인에 데이터와 변수를 저장하는)이 변수를 찾을 수 없으면 찾을 수 없다는 의미입니다. 이전 실행 환경에서는 검색하지 않습니다.
JavaScript에는 블록 수준 범위의 개념이 없으며 함수 수준 범위만 있습니다. : 변수는 함수 본문과 변수가 선언된 하위 함수 내에서 볼 수 있습니다.
범위는 변수와 함수의 접근 가능한 범위로, 변수와 함수의 가시성과 수명주기를 제어합니다. JavaScript에서 변수 범위에는 전역 범위와 로컬 범위가 있습니다.
함수 내에서 선언되지 않았거나 var 없이 선언된 변수는 전역 변수이며 전역 범위를 갖습니다.
<script type="text/javascript"> function test1(){ a = 1;//全局变量,只有在当前函数运行时,才有效 } test1(); console.log(a);//1 注意test1函数必须运行,不然找不到a </script>
전역 변수는 창 개체의 속성으로 사용될 수 있으며 동일합니다.
<script type="text/javascript"> var b = 1;//全局变量 console.log(b === window.b); //true 全局变量可以当做window对象的属性用,他们是一样的; </script>
창 개체의 모든 속성은 전역 범위를 가지며 코드 내 어디에서나 사용할 수 있습니다.
함수 내부에 선언된 변수는 지역 변수이며 함수 본문 내에서만 사용할 수 있습니다. var를 사용하지 않아도 여전히 지역 변수입니다.
<script type="text/javascript"> var c = 1;//全局变量// console.log(d);//ReferenceError: d is not defined 引用错误,当前作用域就是最外层作用域,依然找不到d function test2(d){ console.log(c); //1 全局变量,哪都可以访问;(先找当前作用域,找不到,就向外层作用域找,直到window最外层,找到了) console.log(d);//3 形参是局部变量,只有当前作用域下可以访问 } test2(3); </script>
스코프 체인은 함수가 선언된 위치에 따라 식별자를 구문 분석할 때 현재 범위에서 시작됩니다. 범위에서 발견되면 엔진은 변수를 찾거나 가장 바깥쪽 범위(즉, 전역 범위)에 도달할 때까지 외부 중첩 범위에서 계속 검색합니다. 해당 경로는 고정되어 있으며 아무 작업도 수행하지 않습니다. 함수가 실행되는 위치;
<script type="text/javascript"> var a = 1; var b = 2; var c = 3; var d = 4; function inner(d) {//它的作用域链是inner---全局 var c = 8; console.log(a);//1 当前作用域找不到a,去全局作用域找到了a=1 console.log(b);//2 当前作用域找不到b,去全局作用域找到了b=2 console.log(c);//8 当前作用域找到了c=8 console.log(d);//7 当前作用域找到了d=7,形参也是局部作用域 // console.log(e);//ReferenceError: e is not defined 引用错误,找不到e, 它的作用域链是inner---全局 console.log(a+b+c+d);//18 } function outter(e) { var a = 5;//inner()的作用域链是inner---全局,所以这个a相当于无效 var b = 6;//inner()的作用域链是inner---全局,所以这个a相当于无效 inner(7); } outter(999);//这个999无效,里面的e根本找不到 </script>
동일한 이름을 가진 식별자는 다중 레벨 중첩 범위에서 정의될 수 있습니다. 이를 내부 식별자인 "섀도잉 효과"라고 합니다. 외부 식별자를 "보호"합니다
window.a 기술을 통해 동일한 이름을 가진 변수로 음영 처리된 전역 변수에 액세스할 수 있습니다. 그러나 비전역 변수가 가려지면 어쨌든 액세스할 수 없습니다.
<script type="text/javascript"> var a = 'Lily'; var b = 'Lucy'; function outer() { var b = 'Jesica'; var c = 'Susan'; function inner(c) { console.log(a);//Lily console.log(window.b);//Lucy console.log(b);//Jesica console.log(c);//Jenifer } inner('Jenifer'); } outer(); </script>
실행 컨텍스트(실행 컨텍스트)라고도 합니다. 각 실행 환경에는 함수에 액세스할 수 있는 모든 변수와 데이터(즉, 함수 범위 체인의 모든 데이터와 변수)를 저장하는 변수 개체(변수 개체)가 있습니다. 우리 코드는 이에 접근할 수 없으며, 엔진에서 사용됩니다.
실행 환경 스택이 실행되면 함수의 실행 환경이 스택에 푸시됩니다. 함수가 실행된 후 스택은 실행 환경을 제거하고 그 안의 변수와 데이터는 표시되고 지워지며 가비지 수집을 기다린 다음 이전 실행 환경으로 제어를 반환합니다. 자바스크립트 프로그램의 실행은 이 메커니즘에 의해 제어됩니다.
현재 실행 환경(현재 범위 체인에 데이터와 변수를 저장함)이 변수를 찾을 수 없다면 주의해야 합니다. 더 이상은 스코프 체인과 다른 이전 실행 환경을 검색하지 않습니다.
코드의 실행 순서는 한 줄씩 모두가 아닙니다. 관련 항목:함수가 실행되면 함수의 실행 환경이 환경 스택의 맨 위로 푸시되고 이전 실행 환경은 뒤에 옵니다.
전역 실행; 환경이 먼저 입력되므로 항상 맨 아래에 있습니다.
함수 실행 후 실행 환경이 맨 위에서 제거됩니다. 저장한 데이터와 함수는 표시되고 지워지며
제어권이 이전 실행 환경으로 넘겨지고 실행이 계속됩니다. 🎜>
라인 20을 실행하고 외부(999) 함수를 호출한 다음 외부(999) 함수 실행 환경으로 들어가서 승격을 선언하고 실제 매개변수 999를 형식 매개변수 e에 전달합니다. 두 가지 실행 환경, external(999)는 현재 실행 환경입니다.
18번째 줄을 실행하고 inner(7) 함수를 호출한 후 inner(7) 함수 실행 환경으로 들어가서 승격을 선언하고 실제 매개변수 7을 형식 매개변수 d에 전달합니다.
7행을 실행하고 c=8을 할당한 후 연산하여 출력합니다.
코드 최적화
위 내용은 JavaScript 범위 체인 및 실행 환경의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!