이 기사에서는 JavaScript 사전 준비 및 관련 기술에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
변하기 쉬운
다시,이 두 가지 작은 예제의 오류 비교 프롬프트부터 시작하십시오.
경고 (Y1); // 코드 세그먼트 1var y1 = 'dddd'; alert (y2); // 코드 세그먼트 2 // alert (typeof y2); y2 = 'xxxxx';
먼저 한 사람이 정의되지 않은 이유를 생각하고 다른 하나는 정의되지 않은 변수의 오류를 던지겠습니다. . 먼저 JavaScript 구문 분석 프로세스를 살펴 보겠습니다.
실행 프로세스 전에 JavaScript는 "Preparsement"이벤트를 수행합니다. 구문 분석 엔진은 블록 레벨에서 모든 VAR 변수의 생성을 수행하고 초기 값을 제공합니다. 이런 식으로 첫 번째 예제가 정의되지 않은 이유는 분명합니다.
따라서 첫 번째 코드는 실제로 동일합니다
var y1; 경고 (유형 Y1); // 당연히 그 값은 undefinedy1 = 'dddd'입니다.
두 번째 코드가 왜 다시 잘못을 던 졌습니까? 더 이상 "사전 패러스"단계에 속하지 않습니다 (여기서 브라우저는 스크립트 태그를 만날 때 두 가지만 수행한다고 가정합니다. 즉, 사전 부과 및 실행, 실제로는이 두 가지가 아닙니다). 그러나 실행 단계에서 오류를 던지는 이유는 JS가 실행 세그먼트 상태에서 Y2의 상태를 알지 못하기 때문입니다 (예비 예약 단계에서 Y2의 정보가 캡처되지 않음). 물론 정의되지 않은 오류 정보가 발생하기 때문입니다. 또 다른 문제가 여기에 포함됩니다. JS는 약한 언어이며 정의없이 변수를 사용할 수 있으므로 왜 정의 오류로 여기에 던져 지는가?
일이 일어날 이유가 항상 있습니다. JavaScript에는 항상 많은 이상한 기능이 있으며, 읽고 쓰는 변수가 있습니다. 정의되지 않은 변수는 기록 가능하며 읽을 수 없습니다. 무엇을 쓸 수 있습니까? 누구나이 글쓰기 방법에 익숙합니다.
Y2 = '시험'; // 정의 작업이 나타나기 전에 (즉, 자체 범위가 없기 전에),이 작업은이 코드를 고려하여 전역 변수를 정의하고 창에 속성 Y2를 등록하고 시험에 할당합니다.
그러나 읽을 때 JS 엔진은 관련 정보를 찾을 수 없으므로 자체 성질로 작동하며 망설임없이 정의되지 않은 실수를합니다. 이것이 JS 게임의 규칙입니다. 그럼에도 불구하고 왜 그 유형을 얻을 수 있습니까? 개체에서 JS의 작업을 기억하십시오. 존재하지 않는 객체에 액세스하면 정의되지 않은 메시지가 표시됩니다 (현재 창 객체의 속성이기 때문에).
참고 : 여기서 읽기 및 쓰기 불균일 변수는 변수에만 사용되며 객체의 모든 속성을 읽습니다. 이 기능은 존재하지 않습니다. 존재하지 않으면 정의되지 않은 프롬프트가됩니다.
결론적으로
이 시점에서 내 생각은 다음과 같습니다. 변수와 대상의 작문 작업에는 유사점이 있습니다. 그러나 각각은 읽기 작업 규칙 세트가 있습니다. 이로 인해 위의 문제가 발생합니다.
이런 식으로 다음 질문에 쉽게 답변해야합니다.
if (! ( 'a'in window)) {var a = 1;} alert (a);기능
확장하려면 기능을 수행하십시오. 위에서 언급 한 사전 분보를 기억하십시오. JavaScript의 사전 정량에서 VAR 변수의 사전 정의 외에도 함수의 정의 추출도 포함되므로 함수는 스크립트의 어느 곳에서나 정의되어 어디서나 호출 될 수 있습니다. 이전에 제한되지 않습니다.
그러나 기능의 정의 방법에는 VAR의 방법을 사용하여 기능을 선언하는 문자 정의 방법이 포함됩니다. 아래를 참조하십시오
경고 (유형 Y3); // result? var y3 = function () {console.log ( '1'); }이 계약을 기억하십시오 : 신고서는 선언 후에 표시되어야합니다. 왜? 위의 것을 이해한다면 여기의 답은 실제로 명확합니다. var를 사전 준비 할 때 JavaScript 엔진은 초기 값을 정의하지 않습니다. 이런 식으로, 우리가 선언 전에 호출하면, JavaScript 엔진은 아직 실제 값을 얻지 못했으며, "xxx의 오류는 기능이 아닙니다"라는 오류를 자연스럽게보고합니다. 이것은 또한 두 기능 선언이 왜 선언 및 호출 순서와 관련이 있는지, 다른 하나는 그러한 제약 조건이없는 이유를 명확하게합니다.
결론적으로
기능, JS 실행 및 동적 수정의 결과이며 여전히 변수의 사전 분석 규칙을 따릅니다 (위의 경고 할 때 문자 그럴 함수의 정보를 얻지 못했습니다).
두 가지가 혼합된다면 어떨까요? 다음을보십시오. Y4에 대한 변수와 기능이 모두 있습니다.
경고 (유형 Y4); // result? function y4 () {console.log ( 'y4')} var y4;JavaScript는 사전 준비에서 우선 순위가 높기 때문에 Y4는 당연히 기능 유형이지만 Y4가 할당 된 후 (JS 엔진은 실행 프로세스에 있습니다) JS에 대한 할당 작업이 함수 선언을 무시합니다. 그래서:
alert (y5); var y5 = 'angle'; function y5 () {console.log ( 'ghost'); } 경고 (y5);첫 번째 경고 결과는 JS 실행 프로세스의 최상위에 있기 때문에 기능입니다. Alert의 이름이 바뀌면 두 번째로 그 값은 5로 다시 작성되었습니다 (아래 함수의 정의 위치에 의해 혼동되지 마십시오.)
JS의 분석과 실행에 대해 생각하면서, 나는 많은 질문에 대한 답이 자연스럽게 나타났다는 것을 갑자기 깨달았다는 것을 깨달았습니다. 그 기사의 저자가 말했듯이, "실행 환경의 개념을 이해하면 객체, 클로저, 어휘 범위 및 범위 체인을 호출하면 JS 언어의 많은 현상을 쉽게 해결할 수 있습니다."
이 놀라운 언어로도 지금 되돌아 보면 다시 추적 할 수있는 많은 이유가 있습니다.
더 나은 매개 변수 판단을하는 방법
위에 많은 논의를 한 후 어떻게 실제 개발에 더 가까워 질 수 있습니까? JavaScript의 읽기 및 쓰기 불균형이므로 오류를보고하지 않고 매개 변수 판단을 피할 수있는 방법은 무엇입니까?
예 : :
if (cusvar) {// 여기 판단은 암시적인 문제입니다. }더 엄격한 방법.
if (window [ 'cusvar']) {// 오류가보고되지 않도록하십시오. // 또는 그러한 판단은 또한 실현 가능한 창입니다 .cusvar | Cusvar 타입! == '정의되지 않은'// Work}마지막으로 또 다른 작은 퀴즈가 추가됩니다 (사전 준비 및 실행의 분리를 이해하십시오)
var y7 = 'test'; function fun1 () {alert (y7); var y7 = 'sex';} fun1 ();JavaScript 관련 컨텐츠에 대한 자세한 내용은이 사이트의 주제를 확인하십시오. "JavaScript 스위칭 효과 및 기술 요약", "JavaScript 검색 알고리즘 기술 요약", "JavaScript 애니메이션 효과 및 기술 요약", "Javascript 오류 및 디버깅 기술의 요약" "JavaScript 기술의 요약" "" "요약" "", Malgority Sknickes의 요약 "". JavaScript Traversal 알고리즘 및 기술 "및"JavaScript 수학 연산 사용 요약 "
이 기사가 모든 사람의 JavaScript 프로그래밍에 도움이되기를 바랍니다.