JavaScript 범위 규칙을 이해하려고합니다. 제가 교과서에서 읽었던 것과 문서가 혼란 스럽습니다.JavaScript 범위 및 실행 컨텍스트
JavaScript는 정적 (또는 어휘 적) 범위 언어입니다. 변수 이름을 변수 (정의)에 바인딩하려고하면 코드의 어휘 구조가 사용됩니다.
실행 컨텍스트는 호출 스택의 스택 프레임과 비슷합니다. 각 실행 컨텍스트에는 (연관된 함수의) 모든 로컬 변수가 정의되는 변수 객체가 있습니다. 이러한 변수 오브젝트는 스택의 맨 위에있는 변수 오브젝트에서 스택 맨 아래의 변수 오브젝트 (창 오브젝트)에 이르는 '범위 체인'을 제공하기 위해 함께 링크됩니다. 이 스코프 체인은 변수 이름을 변수에 바인딩 할 때 위에서 아래로 검색됩니다. 이것은 C/C++/Java와 같이 정적으로 범위가 지정된 언어와 매우 유사합니다.
C/C++/Java와 관련하여 다음과 같은 중요한 차이점이 하나 있습니다. 아래 예제와 같이 호출 스택에 스택 프레임이없는 함수에서 정의 된 변수에 액세스 할 수 있습니다.
var color = "red";
var printColor;
function changeColor() {
var color = "green";
printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}
changeColor();
// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function
printColor("in global context, color = "); // "green"
이 권리가 있습니까? 내가 알아야 할 다른 문제가 있습니까? 미리
덕분
JavaScript에 대한 실행 컨텍스트 및 스택은 무엇입니까? (http://davidshariff.com/blog/what-is-the-execution-context-in- javascript /) –
이것을 * 클로저 *라고합니다. 'printColor'에 할당 한 함수는 함수가 종료 된 후에도'changeColor'에 정의 된 모든 변수에 접근 할 수 있습니다. 나는 이것이 C.에 어떻게 있는지 모른다. –
@FelixKling 거의. 그러나 changeColor는 전역 범위에서도 정의되므로 범위가 가비지 수집되지 않습니다. – webduvet