js 어 쩔 수 없 이 -- 폐쇄 와 역할 영역 에 대하 여
function foo(){
var b = "10";
}
console.log(b);// ,b is not defined
위의 demo 에서 전 체 는 변수 b 에 접근 할 수 없고 외부 에 서 는 내부 변 수 를 방문 할 수 없습니다. ② 역할 도 메 인 체인 검색 원칙: 역할 도 메 인 에서 특정한 변 수 를 방문 (읽 기 | 설정) 하면 현재 역할 도 메 인 에서 검색 하고 찾 으 면 직접 사용 합 니 다.만약 에 찾 지 못 하면 상급 역할 영역 에서 계속 검색 하고 찾 으 면 사용 하 며 찾 지 못 하면 위의 과정 을 0 급 역할 영역 체인 까지 반복 합 니 다.
var num = 10;
function f1(){
console.log(num); //undefined , 10
num = 66;
console.log(num); // 66
function f2(){
var num = 99;
console.log(num); // 99
}
var num = 1000;
f2();
console.log(num); //1000
}
f1();
console.log(num); //10
역할 역 의 개념 을 이해 한 후에 책 에 있 는 폐쇄 적 인 해석 에 대해 여러분 도 어느 정도 이해 하 셨 을 것 이 라 고 믿 습 니 다. 외부 역할 역 이 내부 역할 역 의 변 수 를 방문 할 수 없 으 니 우리 가 방문 해 야 한다 면 이 문 제 를 어떻게 해결 해 야 합 니까?그래서 가방 을 닫 고 탄생 했다.
function f1(){
var num = 10;
return function(){
console.log(num);
};
}
var f2=f1();
f2();// 10
위의 사례 는 전형 적 인 패 킷 입 니 다. 외부 역할 도 메 인 은 함수 내부 의 변수 num 을 방 문 했 습 니 다. 그러면 이것 은 어떻게 하 는 것 입 니까?코드 에서 우 리 는 f1 함수 에서 함수 f2 를 리 턴 했 습 니 다. 우 리 는 f1 함수 의 결 과 는 f2 함수 입 니 다. f2 함수 가 호출 될 때 먼저 실행 환경 과 해당 하 는 역할 도 메 인 체인 을 만 듭 니 다. 함수 실행 에서 변수의 값 을 읽 고 쓰기 위해 서 는 도 메 인 체인 에서 변 수 를 찾 아야 합 니 다. f2 함수 에 대해 f1 은 외부 역할 도 메 인 입 니 다.그래서 자 연 스 럽 게 f1 의 변수 num 에 접근 할 수 있 습 니 다. 자신 도 모 르 게 전체 역할 도 메 인 은 f1 의 변수 num 의 값 에 접근 합 니 다.
for (var i = 1; i <= 5; i++) {
setTimeout( function timer(){
console.log(i);
},i*1000);
}
코드 의 실행 결과: 1 초 에 한 번 출력 하고 다섯 번 출력 합 니 다. 6. setTimeout 은 하나의 함수 가 들 어 왔 습 니 다. 일정 시간 지연 되 어 이 함 수 를 대기 열 에 추가 합 니 다. 일정 시간 지연 된 후에 함 수 를 실행 하 는 것 이 아 닙 니 다. 이 함 수 는 모든 다른 함수 가 실 행 된 후에 야 실 행 됩 니 다. 그 전에 for 순환 이 이미 실행 되 었 습 니 다.그래서 매번 인쇄 하 는 값 은 for 순환 의 최종 i 값 6 이 고 1 초 에 한 번 씩 출력 합 니 다.여기 서 타이머 안의 함 수 는 그 역할 영역 범위 의 값 (i 의 값) 을 가 져 올 수 없습니다. 근본 적 인 원인 은 타이머 가 비동기 이벤트 이기 때 문 입 니 다. 이 문 제 를 해결 하려 면 함수 에 즉시 실행 함수 () 를 추가 하 였 습 니 다.매번 순환 할 때마다 타이머 함수 가 즉시 실행 되 고 i 의 인쇄 값 을 가 져 옵 니 다.
for (var i = 1; i <= 5; i++) {
setTimeout(( function timer(){
console.log(i);//1,2,3,4,5
})(),i*1000);
}
물론 Es6 에서 let 설명 변 수 를 사용 하여 블록 급 역할 영역 도 똑 같은 역할 을 했 음 을 밝 혔 습 니 다. 여기 서 저 는 깊이 이해 하지 못 했 고 해석 하지 않 았 습 니 다.
for (let i = 1; i <= 5; i++) {
setTimeout( function timer(){
console.log(i);//1,2,3,4,5
},i*1000);
}
자, 이렇게 쓰 겠 습 니 다. 여러분 이 보시 면 얻 을 수 있 습 니 다. 부족 한 점도 지적 해 주 십시오. O (∩ ∩) O 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.