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两种方式在词法分析时,有着本质区别
    前者,在词法分析阶段,就发挥作用
    而后者,在运行阶段,才发挥作用
     
  • 相关阅读:
    jQuery(jquery ui,jquery plugins)插件笔记1
    怎样批量删除.svn文件
    js中传递参数为0开头的数字时候,存在转码的问题
    struts文件上传,获取文件名和文件类型
    Log4j配置
    怎样通过CSS控制input输入框有readonly属性的背景色
    EXECUTE IMMEDIATE
    row_number() over(partition by column1 order by column2 desc) rn 用法
    React概述
    Web前端,高性能优化
  • 原文地址:https://www.cnblogs.com/yz-blog/p/11328064.html
Copyright © 2011-2022 走看看