자 바스 크 립 트 에서 var 성명 변수 역할 영역 에 대한 추정
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 에 다 적 혀 있 겠 지.근 데 영어 문 서 를 뜯 어 먹 으 면...됐어.스스로 미 루어 짐작 하 다.하하.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
var, let, const의 차이 - 변수 선언 및 할당for 문의 변수 선언문에서 선언한 변수를 for 문의 코드 블록 외부에서 참조할 수 있다. ES6에서는 var의 이러한 특성들 때문에 let과 const 키워드를 도입했습니다. 함수 내에서 선언된 변수는 함수 내에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.