zoukankan      html  css  js  c++  java
  • js词法分析

    javascript词法分析
    函数在运行的瞬间,生成一个活动对象(Active Object),简称AO;
    具体分为两个阶段:
    一.分析阶段
    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:
     
    1.分析参数
    2.分析变量声明
    3.分析函数声明
    二.执行阶段 (即做赋值等操作)
     
    具体例子及简单分析步骤如下:
    *1.无参数情况*
    1 function func() {
    2       console.log(age);
    3       var age = 25;
    4       console.log(age);
    5       function age() {
    6       }
    7       console.log(age);
    8   }
    9 func();
    1.1详细分析步骤
    // 分析阶段
    形成活动对象AO, 假设 AO = {};
    1)分析参数
    a.分析形参(没有跳过)
    b.分析实参(没有跳过)
    2)分析变量声明
    a. AO.age = undefined;(在函数分析阶段默认往AO活动对象添加属性值为undefined);
    3) 分析函数声明
    a. AO.age = function(){};(如果AO中已存在age属性直接做覆盖操作,如果不存在则新建age属性进AO)
    // 执行阶段
    1.打印 function() {};
    2.age赋值25 AO.age = 25;
    3.打印 25;
    4.打印 25;
     
    **//以下例子同上类似步骤简写分析**
    *2.有参数情况*
    1 function func(age) {
    2       console.log(age);
    3       var age = 25;
    4       console.log(age);
    5       function age() {
    6       }
    7       console.log(age);
    8   }
    9 func(18);
    2.1
    // 分析阶段
    1)分析参数
    a. AO.age = undefined;
    b. AO.age = 18;
    2)分析变量声明
    AO.age = 18; (AO中已存在age属性)
    3.分析函数声明
    AO.age = function() {};
    //执行阶段
    1.打印 function() {};
    2.赋值后打印 AO.age = 25;
    3.打印 25;
     
    *3.报错情况*
     1 function func(age) {
     2       var age;
     3      console.log(age);
     4       var age = 25;
     5       console.log(age);
     6       function age() {
     7           console.log(age);
     8       }
     9       age();
    10      console.log(age);
    11  
    12  }
    13 func(18);
    3.1
    // 分析阶段
    1.分析参数
    a. AO.age = undefined;
    b. AO.age = 18;
    2.分析变量声明
    AO.age = 18;(AO中已存在,保持不变);
    3.分析函数声明
    AO.age = function() {}; (存在age属性覆盖)
     
    //执行阶段
    1.打印 function() {};
    2.赋值后打印 25;
    3. age is not a function;(执行函数时AO的age已经为25)
    4. 报错不执行;
     
    *4.变量提升情况*
    1 var name = "test";
    2 function t() {
    3     console.log(name);
    4     var name = "test1";
    5     console.log(name);
    6 }
    7 t();
    类似写法
    var name = "test";
    function t() {
        var name;
        console.log(name);
        name = "test1";
        console.log(name);
    }
    t();

    4.1

    // 分析阶段
    1.分析参数(没有参数跳过)
    2.分析变量声明
    AO.name = undefined;
    3.分析函数声明(没有跳过)
     
    //执行阶段
    1.打印 undefined;
    2.赋值后打印 test1;
     
    注:
    1.函数声明在分析阶段操作
    2.函数表达式在执行阶段操作
     
  • 相关阅读:
    数据库语句中(+)是什么意思
    MySQL的存储引擎(二)解决Warning Code : 3719 'utf8' is currently an alias for the character set UTF8MB3,...
    MSQL存储引擎(一)
    fastjson的使用,在redis里面存list
    js的发展历史,笔记
    spring的断言工具类Assert的基本使用
    httpclient的使用
    nginx的反向代理
    使用 Redis 连接池的原因
    springboot的yml自定义值的笔记
  • 原文地址:https://www.cnblogs.com/jiaqi1719/p/10019689.html
Copyright © 2011-2022 走看看