JavaScript自我学习之解析与执行

    如果想要学好JavaScript那么我们首先必须要知道浏览器JavaScript引擎是如何解释执行JavaScript代码的,作为一名菜鸟,从自己学习JavaScript的过程来说,真心觉得不了解这些在以后的学习JavaScript过程中会徒增许多困惑,多走许多弯路.好了废话不多说了,我们就一起来看看到底怎么一个过程吧.

    浏览器在执行JavaScript代码之前会进行类似写C和C++一样的预编译操作,在预编译的阶段,首先创建一个当前执行环境下的活动对象,并且将那些用 var 声明的变量设置为当前活动对象的属性,但是这些变量的初始化的赋值都是undefined;而对于那些function 定义的函数也添加为当前活动对象的属性,而他们的值赋予的是函数的定义,特别提醒下对于下面的代码不要误解,匿名函数是不会被解析的,funTemp的初始化依旧在执行阶段;

1 var funTemp=function() { //匿名函数
2    alert("Hello World!");
3 }

 针对预编译阶段我们为了便于理解验证,那么首先举例来看一看:

 1 <script type="text/javascript">
 2    alert(tempFirst);     //返回值undefined
 3    var tempFirst="麦兜";
 4   alert(tempFirst);   //返回值 麦兜
 5    
 6  alert(Hello);    //返回值 函数Hello定义语句
 7   alert(Hello());    //返回值 Hello  JavaScript
 8   function Hello(){
 9   alert("Hello  JavaScript");
10 }
11 
12   alert(Hi());   //返回值 undefined
13   var Hi=function (){
14   alert("Hi   JavaScript");
15 }
16 
17 </script>

              预编译阶段结束后我们来看看执行阶段是如何进行的,首先遇到变量需要解析时候,会首先从当前的执行环境中的活动对象进行查找,如果没有找到但是该活动对象拥有prototype属性中进行查找,没有找到的话按照作用域链继续查找.遇到var a=...这样的语句时候则会给相应的变量a进行赋值,下面我们举个有意思例子来加深下对这个概念的理解。

 1  1 <script type="text/javascript">
 2  2 
 3  3 var name="Sudo";
 4  4 
 5  5 function nameScope()
 6  6 {  
 7  7    alert(name);   //  返回值 undefined
 8  8    var name="Admin";
 9  9    alert(name);  //   返回值  Admin
10 10 }
11 11 nameScope();
12 12 alert(name);  // 返回值 Sudo
13 13 </script>

         在执行nameScope()函数时候,第一个alert(name)会先从该函数的作用域里面寻找name属性,因为在预编译的时候确实赋予了当前作用域里面有name属性,并且赋值为undefined,找到了以后当然不会去寻找外围的全局name了,所以先弹出undefined,然后函数里面对其赋值admin初始化,继而弹出Admin,同样在函数执行完成后,类似与其他语言里面的析构函数一样,所有占用的内存全部释放了,而其变量也仅仅在当前函数内执行有效,最外面alert(name),则访问的即是全局变量sudo为弹出结果,留给有意思的代码,猜猜结果

 1 <script type="text/javascript">
 2 
 3 var name="Sudo";
 4 
 5 function nameScope()
 6 {  
 7    alert(name);   //  返回值 Sudo
 8    name="Admin";
 9    alert(name);  //   返回值  Admin
10 }
11 nameScope();
12 alert(name);  // 返回值 Admin
13 </script>

       好了,其实这些是自己一边学习一边总结的,以后或多或少肯定会有错误,希望大家提点下哦

原文地址:https://www.cnblogs.com/crosplion/p/4485434.html