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

    js中的词法分析:当js中的函数执行时,先分析后执行。

    1.词法分析要做几件事??
      1).分析参数
      2).分析变量
      3).分析函数
             分析顺序如上。


    2.如何分析变量声明

    如var str='xin'这个语句是先分析 声明var str 此时值是undefine
     

    这个语句等价于:
      function test(){
        var str;
       alert(str);//此时值是undefine
       str='xin';//然后给str变量赋值
       alert(str);//此时值是xin 
      }


    3.看看例子,考考自己:
     3.1 
      function test(age){
       alert (age);
       var age=12;
       alert(age);
      }
      test(99);
     问题:现在打印什么??
      99     12
          解答:由于js中的要进行词法分析,首先分析参数,然后是变量,最后是函数
         所以age的值变换为  undifine=====>99 ====>12
     大家答对了吗???如果没有答对,就继续向上下看,我会再后面给大家写出答案的解析。


    4.为大家解释3.1的原理
     要想弄懂这个,就要了解js中的活动对象(Active Object)的概念
     函数的变量,有其作用域
     而这个作用域又在哪,??在AO上,也就是活动对象。
     
    5.AO(活动对象Active Object)的介绍。
     在函数的调用瞬间时会产生一个AO对象,这个AO对象的属性,即存储着它的变量

    6.现在我们一起来看上面3.1的事例吧!!!
     
     
      function test(age){
       alert (age);
       var age=12;
       alert(age);
      }
      test(99);

      当我们调用test函数时,就在这一瞬间,产生了一个Active Object (活动对象简称AO),即然他是一

             个对象,那么它就应该有属性,这个属性来自于3个地方(即接收参数,变量声明,分析方法)
      上例可变形为:
       AO.age=undifine;
       AO.age=99;
       //所以第一次打印时是99
       而 var age=12;在AO对象已经有这个属性了,就不会再次词法分析了
       故只是现有AO对象的age属性赋值的过程
       AO.age=12;//等同于var age=12;
       //所以第二次打印时是12;

    7.词法分析与作用域链。
     如果函数嵌套时,每个函数都会再自己被调用时,产生自己的AO,这时,如果调用的方法中没有
     属性值,那么,就像外层找,一层一层的找,直到找到window对象。


    8.详细说明Active Object对象。
     8.1看看下面的例子.
     function test(number){
      alert(number);
     }
     test(2);
     分析上面这个例子:
         第一步:分析,这属于词法分析里的哪种分析
         答:参数分析

         第二步:当test(2);这句话调用test()函数时,
           发生了什么。
                        答:产生了一个AO,并先进行参数分析,A0.number=undifine
             在这个函数的运行中,A0.number又被赋了新值A0.number=2
        第三步:结论  答案是32;

     8.2再来看看这个例子:
     function test2(number,age){
      alert(number);//9
      alert(age);//undifine
     }
     test2(9);
     这次你明白了吗??如果没太懂也没有关系,第一个number打印出9大家是明白的,但是age是undifine就不懂

    了,是吧,这是因为 test2(9);当调用的一瞬间,AO的变化是这样的:
          第一步:  
           AO.number=undifine;
           AO.age=undifine;
          第二步将传入的参数赋值,
           AO.number=9;
          而注意看AO.age是不是还是undifine,这下明白了吧。

     8.3最后看一个吧!!
      function a(b){
      alert(b);
      function b(){
       alert(b);
      } 
        b();
     }
     a(1);
     这次的运行结果是什么??是两个function b(){alert(b)},你答对了吗???

      
     
      
          

  • 相关阅读:
    【143】360云盘资源
    【142】阿蛮歌霸使用技巧
    [置顶] 程序员必知(三):一分钟知道URI编码(encodeURI)
    [置顶] Oracle job procedure 存储过程定时任务
    浅析动态表单
    DoctorNote医生处方笔记开发记录
    Step2:配置Oracle Dataguard
    IOS开发UIImage中stretchableImageWithLeftCapWidth方法的解释
    解析客户端脚本、服务器端脚本
    tomcat目录结构
  • 原文地址:https://www.cnblogs.com/songqiaoli/p/2529391.html
Copyright © 2011-2022 走看看