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

    Javascript 词法分析

    词法分析

    分析3样东西
    第一步:先分析参数
    第二步:再分析变量声明
    第三部:分析函数声明

    一个函数能适用的全局变量,就从上面的3步分析而来

    具体步骤:

    0:函数运行前的一瞬间,生成Aactive Object (活动对象),叫AO
    1:
    1.1 函数声明的参数,形成AO的属性,值全是undefined
    1.2 接收实参,形成AO相应的属性的值

    2:分析变量声明!如var age,
    如果AO上还没有age属性,则添加A0属性,值是undefined
    如果AO上已经有age属性,则不做任何影响

    3:分析函数声明,如function foo(){},
    则把函数赋给AO.foo属性
    注:如果此前foo属性已存在,则被无情的覆盖了
     
    实例一
    function t(age) {
        alert(age)
    }
    
    t(5) //5
    t() //undefined
    词法分析过程:
    AO {age:undefined}

    运行过程:
    t(5) ->AO.age=5;alert(AO.age);//5

    t() ->AO.age没有得到赋值,还是undefined

     实例二
    function t2(age){
        var age = 99;
        alert(age)
    }
    t2();
    
    分析过程

    0:形成AO={}
    1:
    1.1 分析形参 AO = {age:undefined}
    1.2 接收形参 AO = {age:5}

    2:分析var age,发现AO已经有age属性,不做任何影响

    执行过程
    AO.age = 99;
    alert(age)
     
     实例三
    function t3(greet){
        var greet = 'hello';
        alert(greet);
    
        function greet(){}
    
        alert(greet)
    }
    
    t3(null); //hello hello
    
    词法分析过程:
    0:AO = {}
    1:
    1.1 分析参数 AO = {greet:undefined}
    1.2 分析参数 AO = {green:null}
    2:分析green变量声明,A0已经有greet属性,因此不做任何影响
    3:分析green函数声明,AO.greet = function(){},被覆盖成函数

    执行过程:
    green = 'hello'
    alert(greet)
    alet(greet)
     
    实例四
    function a(b){
        alert(b);
        b = function(){
            alert(b)
        }
        b();
    }
    a(1);
    
    词法分析过程
    0:A0 = {}
    1:分析形参 A0 = {b:undefined} -> {b:1}
    2:分析var声明没有?没有
    3:分析函数声明没有?没有
    (注:b = function({}) ,是一个赋值过程,在执行期过程才有用)

    执行过程:
    alert(b);//1
    b = function(){
    alert(b);
    }
    b();//function
     
    函数声明与赋值函数的区别
     
    function t1(){}
    t2 = function(){}
    这两种方式效果不同
    t1是函数声明,虽然全局内也得到一个t1变量,值是function
    t2只是一个赋值的过程,值是谁?值是右侧表达式的返回结果,即函数
    就是说function (){}在js看来,就和3*2,6/3一样,是个表达式,返回一个结果
    因此,t1 t2两种方式在词法分析时,有着本质区别
    前者,在词法分析阶段,就发挥作用
    而后者,在运行阶段,才发挥作用
     
  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/yz-blog/p/11328064.html
Copyright © 2011-2022 走看看