zoukankan      html  css  js  c++  java
  • 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>

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

  • 相关阅读:
    Uri编码,包括javascript前端与C#服务器端
    快速排序
    bootstrap
    boosting
    bagging
    SHELL排序
    冒泡排序
    插入排序
    选择排序
    二叉树的数学性质
  • 原文地址:https://www.cnblogs.com/crosplion/p/4485434.html
Copyright © 2011-2022 走看看