오늘 회사의 약간의 인턴은 두 JS 코드의 차이점을 물었습니다.
Code 1:
<script type = "text/javaScript"> var a = "hello"; 함수 test () {var a; 경고 (a); a = "세계"; 경고 (a); } </스크립트>Code 2:
<script type = "text/javaScript"> var a = "hello"; 함수 test () {alert (a); a = "세계"; 경고 (a); } </스크립트>너무 간단하다고 생각합니다. 글로벌 변수와 로컬 변수 사이의 범위 문제가 아닙니까? "글로벌 변수가 로컬 변수와 복제되면 로컬 변수의 범위는 전역 변수의 범위를 덮어 쓸 것입니다. 로컬 변수의 범위를 남기면 글로벌 변수의 범위로 돌아갑니다. 따라서 두 코드의 결과는 다음과 같습니다.
<cript> var a = 1; 함수 test () {alert (a); var a = 2; 경고 (a); } 시험(); 경고 (a); </스크립트>결과는 무엇입니까? 출력 1 2 1입니까? 글쎄, 나는 테스트 사례를 그녀에게 보내기 전에 그렇게 생각했지만 시험 출력 후 ... 달리기의 결과는 정의되지 않았다.
1. JavaScript 변수의 범위는 메소드 블록에 따라 나뉩니다 (즉, 함수의 한 쌍의 버팀대 {}로 나뉩니다. 블록이 스코프 디비전 기준이 아닌 경우 기능 블록이며 다음 예를 살펴볼 수 있습니다.
<cript> 함수 test2 () {alert ( "스코프의 전 :"+i); // I는 값이 할당되지 않습니다 (명확하지 않음! 명확하지 않은 변수 또는 함수를 사용하여 치명적인 오류를 던지고 스크립트 실행을 중단하십시오) //이 시점에서 i의 값은 (var i = 0; i <3; i ++) {alert ( "spope :"+i); // i는 0, 1, 2이고 3 일 때 루프가 점프됩니다} alert ( "SCOPE의 후 :"+i); // i는 3이고, 그것은 이미 범위를 벗어난 것이지만, 나는 여전히 3으로 유지되어 있고 (true) {var j = 1; 부서지다; } alert (j); // j는 1이고, 외부 스코프가 이미 켜져 있고, j의 값은 1 인 if (true) {var k = 1; } 경고 (k); // k의 값은 1입니다. 이미 범위를 벗어나지 만 k의 값은 1} test2 ()로 유지됩니다. // if (외부 함수 범위) i, j 및 k 변수의 출력은 마법 효과가 있습니까? 경고 (i); //오류! 맞습니다. 오류입니다. 변수가 선언되지 않았기 때문에 (할당되지 않은 경우, Test2 함수의 첫 번째 줄의 출력을 구별 함) 스크립트 오류가 발생하고 프로그램이 여기에서 종료되기 때문입니다! Alert ( "이 라인이 여전히 출력됩니까?"); // 실행되지 않은 경고 (j); // 실행되지 않은 경고 (k); // 실행되지 않음 </script>2. 실행하기 전에 JavaScript는 전체 스크립트 파일 (로컬 변수 포함)의 선언 부분에 대한 완전한 분석을 수행하여 실제 변수의 범위를 결정합니다. 이해하는 방법? 다음 예를 참조하십시오.
<cript> var a = 1; 함수 test () {alert (a); // a는 정의되지 않았습니다! 중복 로컬 변수가 함수 스코프 (함수 본문의 네 번째 마지막 줄)에서 선언되었고 // 글로벌 변수 A가 덮어 쓰기 때문에이 A는 글로벌 변수가 아닙니다. 이는 JavaScript가 실행 전에 전체 스크립트 파일의 정의 부분에 대한 완전한 분석을 수행 함을 보여줍니다. 따라서 함수 test ()가 실행되기 전에 // 변수 a 기능 본문의 A는 외부 글로벌 변수 대신 내부 로컬 변수를 가리 킵니다. 그러나 현재 A는 선언되어 있고 값을 할당하지 않았으므로 정의되지 않은 출력을 출력합니다. a = 4 경고 (a); // a는 4입니다. 서스펜스가 없습니까? 여기 A는 여전히 로컬 변수입니다! var a; // 로컬 변수 a declares alert (a); // A는 이전에 할당 되었기 때문에 a는 여전히 4입니다} test (); 경고 (a); // a는 함수 범위에 있지 않은 1입니다. a의 값은 글로벌 변수의 값 </script>입니다.3. 글로벌 변수가 로컬 변수와 복제되면 로컬 변수의 범위는 글로벌 변수의 범위를 덮어 씁니다. 로컬 변수의 범위를 떠난 후 글로벌 변수의 범위로 돌아갑니다. 글로벌 변수가 로컬 변수를 만나면 글로벌 변수를 사용하는 방법은 무엇입니까? Window.globalvariableName을 사용하십시오.
<cript> var a = 1; 함수 test () {alert (window.a); // a는 1입니다. 여기 A는 전역 변수입니다! var a = 2; // 로컬 변수 a는이 줄 알림 (a)에 정의됩니다. // a는 2이고, 여기는 로컬 변수입니다! } 시험(); 경고 (a); // a는 1입니다. 함수 범위에 있지 않으며 A의 값은 전역 변수의 값입니다 </script>물론 더 많은 기사는 아래 관련 기사를 참조하십시오.