美文网首页程序员
*函数预编译相关[JavaScript_005]

*函数预编译相关[JavaScript_005]

作者: 六亲不认的步伐 | 来源:发表于2019-03-12 21:54 被阅读0次

    JavaScript一些特点


    1. 单线程执行
    2. 解释性语言,解释一行执行一行

    预编译


    作用:可以进行初始化相关操作
    原则(现象):函数声明整体提升; 变量 声明提升;
    解释1:函数声明整体提升

    test();//此时调用结果仍旧可以输出hello
    function test(){
        console.log('hello');
    }
    

    原因:函数声明时会提升自己的位置,置于Js脚本顶部
    解释2:变量 声明提升

    var a ;
    console.log(a);//此时结果为undefined
    a = 'hello';
    
    console.log(a);//此时结果为undefined
    var a = 'hello';
    

    原因:变量声明时会提升自己的位置,第二个脚本的声明和赋值操作在一起,所以可以看作脚本一的效果一致,将脚本二的声明放置顶部。

    预编译前奏


    imply gobal(暗示全局变量)

    在变量未经过声明,直接进行赋值

      a = 10;
      console.log(a);//此时输出仍为10,但是此时的a为window.a,其中window为全局的域
    
     function test(){
    var a = b =159;//其中b未声明,为window域所有
    }
    //输出window.a =undefined;
    //输出window.b =159;
    

    预编译详解(函数AO)


    • 步骤
      1. 创建AO (Activation Object)活跃对象,也是执行期上下文
      2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
      3. 将实参与形参统一
      4. 函数体的函数声明,注意不是函数表达式
    function fn(a){
    console.log(a);//输出结果为function a(){}
    var a =123;
    console.log(a);//输出结果为123
    function a(){};
    console.log(a);//输出结果为123
    var b = function(){}
    console.log(b);//输出结果为function(){}
    function d(){};
    }
    fn(1);
    

    关注AO对象预编译的过程


    阶段1

    创建AO对象

    阶段2

    变量 原因
    a undefined 初始化
    b undefined 初始化
    阶段3

    变量 原因
    a 1 实参与形参统一
    b undefined 不变
    阶段4

    变量 原因
    a function a(){} 函数声明
    b undefined 不变
    d function d(){} 函数声明

    预编译详解(全局GO)


    • 步骤
      1. 创建GO (Global Object)全局对象,可以理解为window === GO
      2. 函数体的函数声明,注意不是函数表达式

    预编译详解(混合GO+AO)


    • 预编译顺序:先生成GO对象,在执行方法前生成AO对象;
    • 访问关系:先访问AO,若不存在则访问GO;(链式关系
    • 练习1
    gobal = 100;
    function fn(){
    console.log(gobal);//undefined
    gobal = 200;
    console.log(gobal);//200
    var gobal = 300;
    }
    fn();
    var global;
    
    • 练习2
    function tests(){
    console.log(b);//undefined(并不会报错,预编译时不考虑if)
    if(a){
    var b = 100;
    }
    console.log(b);
    c = 234;
    console.log(c);//234(为GO.c)
    }
    var a;
    test();
    a = 10;
    console.log(c);//234
    
    • 练习3
    a = 100;
    function demo(e){
    function e(){};//undefined
    arguments[0] = 2;
    console.log(e);//2
    if(a){
      var b =123;
      function c() {
      }
    }
    var c;
    a = 10;
    var a;
    console.log(b);//undefined
    f = 123;
    console.log(c);//undefined(function c(){})
    console.log(a);//10
    }
    var a;
    demo(1);
    console.log(a);//100
    console.log(f);//123
    

    相关文章

      网友评论

        本文标题:*函数预编译相关[JavaScript_005]

        本文链接:https://www.haomeiwen.com/subject/wgdgpqtx.html