javascript 실행 메커니즘의 실행 순서 이해

자바스크립트는 자바나 C# 등 컴파일링 언어와 달리 중간 언어로 컴파일할 필요가 없고 브라우저에서 동적 해석과 실행을 하는 묘사형 스크립트 언어이다.만약에 자바스크립트 언어의 운행 메커니즘을 이해하지 못하거나 간단하게 말하면 자바스크립트의 집행 순서를 파악할 수 없다면 백락이 천리마를 다루지 못하고 천리마를 고삐를 풀고 사방으로 쏘다니는 것과 같다.
그럼 자바스크립트는 어떻게 해석하는 거예요?그것의 집행 순서는 또 어떻습니까?이런 것들을 이해하기 전에 우리는 먼저 몇 가지 중요한 용어를 알게 되었다.
1. 코드 블록
JavaScript의 코드 블록은 레이블로 분할된 코드 세그먼트입니다.예:

<script type="text/javascript">
   alert("这是代码块一");
</script>
<script type="text/javascript">
   alert("这是代码块二");
</script>
JS는 코드 블록에 따라 컴파일되고 실행되며 코드 블록 간에 독립적이지만 변수와 방법이 공유됩니다.무슨 뜻이죠?예를 들면, 너는 알게 될 것이다.

<script type="text/javascript">
   alert(str);//因为没有定义str,所以浏览器会出错,下面的不能运行
   alert("我是代码块一");//没有运行到这里
   var test = "我是代码块一变量";
</script>
<script type="text/javascript">
   alert("我是代码块二"); //这里有运行到
   alert(test); //弹出"我是代码块一变量"
</script>
위의 코드에서 코드 블록 1의 운행이 오류를 보고하지만 코드 블록 2의 실행에 영향을 주지 않는다. 이것이 바로 코드 블록 간의 독립성이고 코드 블록 2에서 코드 1에 호출될 수 있는 변수는 블록 간의 공유성이다.
2. 성명식 함수와 부치식 함수
JS의 함수 정의는 성명식 함수와 부치식 함수 두 가지로 나뉜다.

<script type="text/javascript">
   function Fn(){ //声明式函数
    	
   }
    
   var Fn = function{ //赋值式函数
    	
   }
</script>
성명식 함수와 부치식 함수의 차이점은 JS의 사전 번역기에서 성명식 함수는 먼저 추출된 다음에 순서대로 js 코드를 집행하는 것이다.
3. 번역 기한과 집행 기한
사실 JS의 해석 과정은 두 단계로 나뉘는데 그것이 바로 사전 번역기(사전 처리)와 집행기이다.
사전 컴파일러 JS는 이 코드 블록에 있는 모든 성명된 변수와 함수를 처리합니다(C 언어와 유사한 컴파일). 그러나 주의해야 할 것은 이때 처리 함수는 성명식 함수일 뿐이고 변수도 성명만 했지만 초기화되고 값을 부여하지 않았습니다.

<script type="text/javascript">
     Fn();  //执行结果:"执行了函数2",同名函数后者会覆盖前者
     function Fn(){ //函数1
        alert("执行了函数1");
    }
        
     function Fn(){  //函数2
        alert("执行了函数2");
     }
</script>  

<script type="text/javascript">
   Fn(); //执行结果:"执行了声明式函数",在预编译期声明函数及被处理了,所以即使Fn()调用函数放在声明函数前也能执行。
   function Fn(){ //声明式函数
     alert("执行了声明式函数");
   }
    
   var Fn = function(){ //赋值式函数
     alert("执行了赋值式函数");
   }
</script>

//代码块一
<script type="text/javascript">
      alert(str);//浏览器报错,但并没有弹出信息窗
</script>
//代码块二
<script type="text/javascript">
      alert(str); //弹窗"undefined"
      var str = "aaa";
</script>
//js在预处理期对变量进行了声明处理,但是并没有进行初始化与赋值,所以导致代码块二中的变量是unfiened的,而代码一中的变量是完全不存在的,所以浏览器报错。
위의 몇 가지 용어를 이해하고 여러분은 JS의 운영 메커니즘에 대해 대략적인 인상을 가지고 있다고 믿습니다. 이제 예를 들어 보겠습니다.

<script type="text/javascript">
   Fn(); //浏览器报错:"undefined"
</script>
<script type="text/javascript">
   function Fn(){ //函数1
     alert("执行了函数1");
   }
</script>
왜 위의 코드 브라우저를 실행하면 오류가 발생합니까?성명 함수는 예처리 기간에 처리되지 않습니까? 어떻게 Fn() 함수를 찾을 수 없습니까?사실 이것은 이해 착오점이다. 우리가 위에서 말한 JS 엔진은 코드 블록에 따라 순서대로 집행된다. 사실 완전하게 말하면 코드 블록에 따라 예처리와 집행을 해야 한다. 즉, 예처리는 실행된 코드 블록의 성명 함수와 변수일 뿐이고 아직 불러오지 않은 코드 블록에 대해서는 예처리를 할 수 없다. 이것도 컴파일하면서 처리하는 핵심이다.
이제 정리하겠습니다.
              step 1. 첫 번째 코드 블록을 읽습니다.
              step 2. 문법 분석을 하고 오류가 있으면 문법 오류(예를 들어 괄호가 일치하지 않는 등)를 보고하고 step5로 이동합니다.
              step 3. var 변수와function 정의를 미리 컴파일링 처리합니다. (정확한 성명만 해석하기 때문에 영원히 틀리지 않습니다.
              step 4. 코드 세그먼트를 실행하고, 오류가 있으면 오류를 보고합니다. (예를 들어 변수가 정의되지 않았습니다.)
              step 5. 다음 코드 세그먼트가 있으면 다음 코드 세그먼트를 읽고 step2를 반복합니다.
              step6. 끝.
한편, HTML 문서 흐름의 실행 순서에 따라 페이지 요소가 렌더링되기 전에 실행해야 하는 js 코드는 앞의 코드 블록에 넣어야 하고, 페이지 요소가 불러온 후의 js는 요소 뒤에 놓아야 하며, body 라벨의 onload 이벤트는 맨 뒤에 실행됩니다.

<script type="text/javascript">
  alert("first");
  function Fn(){
  	alert("third");
  }
</script>
<body οnlοad="Fn()">
  
</body>
<script type="text/javascript">
  alert("second");
</script>
자바스크립트 실행 메커니즘의 실행 순서에 대한 이해를 위한 이 글은 여기까지 소개되었습니다. 자바스크립트 실행 메커니즘의 실행 순서에 대한 더 많은 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기