Javascript 词法分析

时间:2019-08-09
本文章向大家介绍Javascript 词法分析,主要包括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两种方式在词法分析时,有着本质区别
前者,在词法分析阶段,就发挥作用
而后者,在运行阶段,才发挥作用
*/

  

原文地址:https://www.cnblogs.com/yz-blog/p/11328064.html