• js词法分析


    在函数运行时, 会先进行词法分析(预编译) 预编译做哪些工作?

    1:分析参数

    2:分析变量声明

    3:分析函数声明

    如何分析变量声明?

    答:对于var 声明的变量, 以var str = 'local'为例, 分为分析过程 和 执行过程.

    先分析, 后执行.

    先分析  var str;     ,即仅仅声明一个str变量,str变量此时,没有赋值,值是undefined

    然后再进行 执行过程.

    var str = 'global';
        function t() {
            /*
            alert(str); // undefined
            var str = 'local';
            alert(str); // local
            */
    
    
    
            ///  词法分析
            var str;
    
            // 执行语句
            alert(str);
            str = 'local';
            alert(str;);
    
        }
    
        t();

      活动对象/激活对象, Active Object  

      函数的变量 有其作用域,  

    即, 引用某变量时,在某个范围内查询该变量,   这个范围,又在哪儿?

      在AO上找

      在函数调用的瞬间,会产生一个AO,   这个AO对象,的属性, 即存储着该函数所能引用到的变量.

    function fn1(age,hei) {
        var age;
        alert(age); // 32
        alert(hei); // undefined
    }
    
    fn1(32);
    function fn1(age,hei) {
        var age;
        alert(age);
        function age() {
            alert('hehe');
        }
    }
    
    fn1(32);
    
    /*
    //词法分析过程
    AO:{}
    AO:{age:undefined,hei:undefined}
    AO:{age:32,hei:undefined}
    AO:{age:function(){alert('hehe')},hei:undefined}
    
    // 执行:
    alert(age); --->AO.age--->函数
    */
     function t(age) {
            alert(age);  // 99
            var age = 12;
            alert(age);  // 12
        }
    
        t(99);
    
       AO:{age:undefined}   // 词法分析形参得到
       AO:{age:99}         // 实参赋值 AO.age属性
       AO:{age:12}         // 修改AO.age的值
    function a(b) {
       alert(b);  // function b(){}
       function b(){
            alert (b);  // 
        }
        b();
    }
    
    a(1);
    
    /*
    //词法分析过程
    a:AO:{}
    a:AO:{b:undefined}
    a:AO:{b:function}
    
    b:AO {}
    b:AO.b --->{}--->a:AO
    
    
    // 执行:
    alert(age); --->AO.age--->函数
    */
    // 函数声明 与函数表达式
    
    
        // 函数表达式
        function fn1(age,hei) {
            alert(age);   
            
            var age = function () {
                alert('hehe');
            }
    
            alert(age); 
        }
        
        // undefined, function
        // function,function
        // 32, function (正确)
    
        fn1(32);
    
    
        // 函数声明
        function fn1(age,hei) {
            alert(age);   
            
            function age () {
                alert('hehe');
            }
    
            alert(age); 
        }
        
        // undefined, function
        // function,function (正确)
        // 32, function
    
        fn1(32);
  • 相关阅读:
    Java基础:基本类型
    完全干净的卸载VS2013
    git本地仓库首次push到远程仓库出现错误 ! [rejected] master -> master (fetch first)
    运行VS出现warning C4996错误的解决办法
    xbmc-android的编译
    linux执行sh,出现/bin/sh^M: bad interpreter: No such file or directory
    Ubuntu配置android-vlc编译环境(2015-11-05)
    a80修改默认4k输出,官方代码锁死了
    ubuntu12.04平台下a80编译环境搭建
    编译java代码出现 错误: 需要class, interface或enum 提示
  • 原文地址:https://www.cnblogs.com/leejersey/p/2775086.html
Copyright © 2020-2023  润新知