燕十八老师JS高级之词法分析笔记

本文详细解析了JavaScript的词法分析过程,包括参数、变量声明和函数声明的分析,以及在函数执行中如何形成活动对象(AO)。通过实例展示了变量和函数在AO中的声明和覆盖规则,深入理解JavaScript的作用域机制。
摘要由CSDN通过智能技术生成
词法分析 分析什么?
按顺序3样东西
1.先分析参数
2.再分析变量声明
3.分析函数声明
一个函数能使用的局部变量,就从上面的3步分析而来
具体步骤:
1.在函数运行的前的瞬间,会生成Active Object(活动对象)
2.再把声明的参数(形参) 形成AO的属性 值全是undefined
  如果有实参:则接收形成相应参数的值
3.再分析变量声明!  如var age(如果没有变量声明则跳过该步骤)
    如果AO上已经有age属性,则不做任何影响
    如果AO上还没有age属性,则添加AO属性,值为undefined
4.分析函数声明,如function foo(){}
    把函数赋给AO.fool属性
    注意: 如果此前fool属性已经存在,则会被无情地覆盖
    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  还是undefined
    function t2(age) {
      var age=99;
      alert(age);
    }
    t2(5);
以上分析过程:
0.形成AO一个空对象  AO={}
1.分析形参  AO={age:undefined}  分析实参 AO={age:5}
2.分析变量var age   发现AO已经有age属性  因此不做任何影响

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

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

执行过程:
alert(greet);   //function greet(){}
alert(greet);    //function greet(){}
    function a(b) {
        alert(b);
        b = function (){
             alert(b);
        }
        b();
    }
    a(1);
  词法分析 分析什么?
    按顺序3样东西
    1.先分析参数
    2.再分析变量声明
    3.分析函数声明
    一个函数能使用的局部变量,就从上面的3步分析而来
    具体步骤:
    1.在函数运行的前的瞬间,会生成Active Object(活动对象)
    2.再把声明的参数(形参) 形成AO的属性 值全是undefined
      如果有实参:则接收形成相应参数的值
    3.再分析变量声明!  如var age(如果没有变量声明则跳过该步骤)
        如果AO上已经有age属性,则不做任何影响
        如果AO上还没有age属性,则添加AO属性,值为undefined
    4.分析函数声明,如function foo(){}
        把函数赋给AO.fool属性
        注意: 如果此前fool属性已经存在,则会被无情地覆盖


分析过程:
0:生成一个活动对象AO={}
1:分析形参声明  AO={b:undefined}  分析实参 AO={b:1}
2:分析变量var声明  没有  跳过该步骤
3:分析函数声明 (重难点)此处有没有声明函数?
   b=function(){}   是一个赋值过程, 是一个函数表达式的返回值 赋值给b变量

执行过程:
alert(b); //  1
b=function(){
  alert(b);
}
b();// function(){alert(b)}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值