자 바스 크 립 트 에서 var 성명 변수 역할 영역 에 대한 추정

하나,심사숙고!코드 로 인 한 의혹 은 다음 과 같은 코드 를 보십시오.자 바스 크 립 트 에서 var 로 설명 한 변 수 를 국부 변수 로 볼 수 있다 면 이 변수의 역할 영역 에 접근 할 수 있 는 것 이 이 변수의 국부 역할 영역 입 니 다.예 를 들 어 console.log 줄 에 j,k 의 역할 영역 이 있 고 순환 외 에 도 i 의 역할 영역 이 있 습 니 다.여기까지 만 말 하면 자 바스 크 립 트 는 진정한 의미 가 없 는 부분 적 역할 영역 이 라 고 독단적으로 말 할 수 있 을 것 이다.진짜 요?비단!2.어떻게 진정한 국부 작용 역 을 얻 습 니까?하나의 서법 이 나의 주 의 를 끌 었 다.여러분 은 JQuery 의 소스 코드 나 Ext 의 소스 코드 를 보 았 을 수도 있 고 아래 의 서법 에 대해 좀 익숙 할 수도 있다
 
for(var i=0;i<3;i++) {
console.log(j+","+k);
for(var j=0;j<3;j++) {
var k = j+1;
}
}
console.log(i);
출력 결과:3,4,1,2 신기 한 발견(사실 신기 하지 않 습 니 다.모두 가 알 고 있 습 니 다)함수 내 부 는 독립 적 인 역할 영역 이 있 습 니 다.즉,함수 내부 var 성명 의 변 수 는 함수 내부 에서 만 사용 할 수 있 습 니 다.그래서 각 프레임 워 크 의 대사 들 은 모두 이렇게 써 서 자신의 국부 변수 와 외부 변수(외층 국부 변수 와 전역 변수)가 충돌 하 는 것 을 방지한다.이로써 저 는 첫 번 째 조 의 독단적 인 추측 을 취소 하고 수정 하 겠 습 니 다.자바 스 크 립 트 는 함 수 를 경계 로 하고 모든 함수 내부 에 부분 적 인 역할 영역 이 있 습 니 다.다른 블록(일반 코드 블록,for 순환,if,while 등 코드 블록 포함)은 부분 적 인 역할 영역 이 존재 하지 않 습 니 다.var 성명 의 변 수 를 사용 하면 이 코드 블록 을 직접 통과 하여 외부 코드 에 접근 할 수 있 습 니 다.3.언제 잘못 을 보고 하고 언제 정의 되 지 않 습 니까?var 의 성명 메커니즘 보기 코드:
 
var a = 3,b=4;
var exports = (function() {
var a = 1,b=2;
return {a:a,b:b};
})();
console.log(""+a+","+b);
console.log(exports.a+","+exports.b);
출력 결과:Reference Error:a is not defined 출력 결과:undefined
 
console.log(a)
출력 결과:Reference Error:a is not defined 추측 결론:자바 스 크 립 트 엔진 이 코드 를 실행 할 때마다 역할 영역 에 있 는 코드 를 먼저 스 캔 합 니 다(역할 영역 에 있 는 function 내부 코드 는 스 캔 하지 않 습 니 다).그리고 모든 var 성명 의 변 수 를 기록 합 니 다.코드 가 할당 되 기 전에 이 변수의 값 은 undefined 입 니 다.이후 에 변 수 를 방문 할 때 부분 변 수 를 먼저 방문 하고 이 부분 변수 가 없 으 면 이전 층 의 부분 변 수 를 방문 합 니 다(예 를 들 어 패키지,이전 층 은 패키지 로 환경 을 만 듭 니 다).전체 국 변 수 를 방문 할 때 까지.이 변수 가 없 으 면 이상 을 던 집 니 다.4.주제 별:패키지+비동기,변수 값 오류!어떻게 비동기 상황 에서 국부 변수의 현재 값 의 전달 을 확보 합 니까?아니면 코드 말 하기:
 
var exports = (function() {
var a = 1,b=2;
return {a:a,b:b};
})();
console.log(a);
출력 결과:3,3 왜?패 킷 을 닫 고 비동기 적 으로 실 행 될 때 i 는 항상 외부 역할 도 메 인 i 를 방문 하기 때문에 비동기 적 이기 때문에 패 킷 을 실행 할 때 순환 이 끝 났 습 니 다.i 는 3 이 되 었 기 때문에 매번 인쇄 된 것 은 3 입 니 다.그럼 이 문 제 를 어떻게 해결 합 니까?우 리 는 i 를 국부 변수 로 변환 해 야 한다.응,이런 표기 법 이 있 을 거 야
 
for(var i=0;i<3;i++) {
setTimeout(function() {
console.log(i);
},1);
}
수출 결과:222 왜?사실은 전에 설명 을 했 는데 사실은 j 와 i 의 역할 영역 이 똑 같 습 니 다.모두 외부 부분 변수 입 니 다.비동기 상황 에서 순환 실행 이 완 료 될 때 j 는 2(i 보다 i++가 한 번 적 음)입 니 다.그럼 어 떡 하지?어떤 광 고 를 상상 해 보 세 요.함수 중의 매개 변수 도 함수 의 부분 변 수 를 계산 한 다 는 것 을 잘 알 고 있 습 니 다.그러면 여기 서 부분 변 수 를 함수 의 실제 인삼 으로 바 꾸 면 값 전달 효 과 를 얻 을 수 있 는 방법 이 있 습 니 다
 
for(var i=0;i<3;i++) {
var j = i;
setTimeout(function() {
console.log(j);
},1);
}
출력 0112 사실 이렇게 많이 말 했 습 니 다.코드 를 쓰 면 여러분 은 잘 모 르 시 겠 죠?이런 익명 함수 의 방식 으로 비동기 상황 에서 변수 변화 문 제 를 제 거 했 습 니 다.그러나 이것 은 본 게시 물의 주제 입 니 다.총화:어.쓰 지 않 겠 습 니 다.게 으 르 니 언제 시간 을 내 서 보충 하 겠 습 니까?헤헤.사실 이 결론 들 은 RFC 에 다 적 혀 있 겠 지.근 데 영어 문 서 를 뜯 어 먹 으 면...됐어.스스로 미 루어 짐작 하 다.하하.

좋은 웹페이지 즐겨찾기