zoukankan      html  css  js  c++  java
  • JS中的预编译(词法分析)阶段和执行阶段

    javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结

    首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法

    在预编译中,javascript对这两种声明做出了两种处理方案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <script>
      var a = "1";    //声明变量a
     function b(){    //声明方法b
        alert();
      }
      var c = function(){ //声明变量c
        alert();
      }
    </script>

    以上代码块中,a、c为变量赋值,b为函数声明,当执行以上的代码时,首先会进入预编译阶段,对与变量赋值a、c会在内存中开辟一块内存空间并指向变量名,且赋值为undefined

    对于函数声明,则同样会进行开辟内存空间,但赋值的对象会将声明的函数赋值给函数名

    预编译阶段:(PS:不管代码中声明变量和声明函数的顺序如何,在预编译阶段会先声明变量,再声明函数)

    1
    2
    3
    4
    5
    <script>
        var a = undefined;
        var c = undefined;         var b = function(){
          alert();
        } </script>

     执行阶段:

    1
    2
    3
    4
    5
    6
    <script>
        a = "1";
        c = function(){
          alert();
        }
    </script>

    整体执行步骤:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <script>
        var a = undefined;
        var c = undefined;
        
        var b = function(){
          alert();
        }
        a = "1";
        c = function(){
          alert();
        }
    </script>

    题目:

    1
    2
    3
    4
    5
    6
    7
    8
    <script>
        var a = "1";
        function b(){
          alert(a);
          var a = "2";
        }
        b();
    </script>

    ps:javascript的预编译

         一、先预定义变量,再预定义函数

      二、变量的预编译只作声明,不作初始化,初始化在执行时

       三、function语句定义的函数,不仅声明了函数名,而且函数体也进行了处理

      四、匿名函数不会预编译

    1
    2
    3
    4
    function f(){      // 声明函数f 
    return 1; } alert(f());       // 返回1
    var f = function(){    // 定义匿名函数f 
    return 2; } alert(f());       // 返回2

    先预定义了变量f,然后同名函数f()覆盖了变量f,所以第一次输出1;变量的预编译

    1
    2
    3
    4
    5
    6
    var f = function(){    // 定义匿名函数f 
    return 1; }
    alert(f());       // 返回1
    function f(){      // 声明函数f 
    return 2; }
    alert(f());      // 返回1

    先预定义了变量f,然后同名函数f()覆盖了变量f.

  • 相关阅读:
    Centos7网络配置(VMware)
    Djangoform表单Ajax控制跳转
    selenium Webdriver 处理iFrame之间的切换问题------------
    Eclipse相关的快捷键
    selenium webdriver----如何处理div弹窗、alert、confirm、prompt对话框-------------------
    处理basic认证,浏览器自带弹窗的(非windows弹窗)处理-----------------
    元素的Actions(特效)及基本UI控件操作
    查找页面元素一
    调用exe文件(一般处理登陆安全窗口)+睡眠等待(--------------------)
    用autoit识别windows窗口(保存弹窗及登陆(basic认证)相关的弹窗)-----
  • 原文地址:https://www.cnblogs.com/liuguniang/p/6916035.html
Copyright © 2011-2022 走看看