문제 풀이 JS 역할 영역
var a = 1;
function fn() {
console.log('1: ' + a);
var a = 2;
bar();
console.log('2: ' + a);
}
var a = 3;
function bar() {
console.log('3: ' + a)
}
fn();
너 는 먼저 자신의 답안 을 쓴 후에 정 답 을 비교 할 수 있다. 만약 틀 리 면 어디 에 문제 가 생 겼 는 지 보 자.정 답 은...
// 1: undefined
// 3: 3
// 2: 2
모든 JS 프로그램 은 전역 적 인 역할 영역 을 만 들 고 함 수 를 실행 합 니 다. 예 를 들 어
fn()
부분 적 인 역할 영역 을 만 듭 니 다.함 수 를 실행 할 때 변 수 를 찾 는 과정 은 다음 과 같 습 니 다. 현재 역할 영역 을 먼저 찾 은 다음 에 필요 한 변 수 를 찾 을 때 까지 한 단계 씩 위로 찾 습 니 다.위의 예 에서 집행 fn()
을 먼저 fn
에서 찾 아 보 니 var
은 하나의 변수 var
를 정 의 했 고 var
는 변수 가 향상 되 는 능력 을 가지 기 때문에 첫 번 째 로 인쇄 한 것 은 undefined
이다.ES6 의
let
, const
변 수 를 향상 시 키 는 기능 을 가지 지 않 습 니 다. 예전 에 JS 는 블록 급 역할 영역 이 없다 고 했 지만 let
, const
블록 급 역할 영역 에서 만 유효 하기 때문에 지금 은 잘못된 것 입 니 다.이 어 두 번 째, 집행
bar()
을 분석 했다. 먼저 bar()
안에 변수 a
가 있 는 지 살 펴 보 자. 답 은 없 는 지, 다시 한 층 으로 찾 아 보 자. 윗 층 은 함수 가 정 의 된 역할 영역 이지 함수 가 호출 된 역할 영역 이 아니 라 여기 서 전체 사용 영역 이기 때문에 두 번 째 출력 3: 3
이다.세 번 째 는 같은 이치 로 쉽게 얻 을 수 있다
2: 2
.var a = 1;
function fn() {
console.log('1: ' + a);
a = 2;
}
a = 3;
function bar(){
console.log('2: ' + a)
}
fn();
bar();
:
// 1: 3
// 2: 2
제 가 만 든 첫 번 째 답 은
1:1
입 니 다. 코드 의 실행 순 서 를 잘 모 르 기 때문에 함수 가 호출 되 지 않 으 면 함 수 를 정의 하 는 그 코드 는 실행 되 지 않 습 니 다.그래서 수출 1: 3
, 두 번 째 수출 2: 2
.함수 호출 의 위 치 는 매우 중요 합 니 다. fn()
와 bar()
호출 순 서 를 바 꾸 면 답 도 다 릅 니 다.