全局上下文GO与函数上下文AO

Posted xsg1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全局上下文GO与函数上下文AO相关的知识,希望对你有一定的参考价值。

前几天在网上逛帖子的时候,看了几个Js的题,发现都是关于GO与AO的一些应用,正好自己也重新回顾一下。
先看题:(PS:如果有兴趣做做题的小伙伴,可以在下方评论说出自己第一感觉的答案哦)

  1.

    var a = 1;
    function a()
      console.log("aa");
    ;
    function test();
    console.log(a);
  2.
    function test(a)
      console.log(a);
      var a = 1;
      console.log(a);
      function a();
      console.log(a);
      var b = function();
      console.log(b);
      function d()

    
    test(2);

  
  答案:
    第一个:输出a为:1
    第二个:输出:function a(),1,1,function ()
  
  下面简单的说一下GO与AO
    GO:全局上下文,Global Object,它在全局代码执行前产生
    产生的时候做了什么呢?分为以下几个步骤:
        1:寻找变量声明
        2:寻找函数声明,赋值
        3:代码执行
    AO:Activation Object 活跃对象,函数上下文,在函数执行前产生
    产生的时候做了什么呢?分为以下几个步骤:
        1:寻找形参和变量声明
        2:实参赋值给形参
        3:寻找函数声明,赋值
        4:代码执行
  
  分析第一题:
    主要是GO
      GO =
        a:undefined  (寻找变量声明)
         ->function a()  (寻找函数声明赋值)
         ->1  (代码执行)

        test:function test()  (寻找函数声明赋值)
      
      所以代码执行到console时,此时a已经被赋值1,输出1

    第二题:
      首先是GO
      GO =
        test:function test()...  (寻找函数声明赋值)
      
      当test函数要执行时,创建AO
      AO =
        a:undefined  (寻找形参和变量声明)
         ->2       (实参赋值给形参)
         ->function a()...  (寻找函数声明,赋值)
         ->1       (代码执行)
        b:undefined  (寻找形参和变量声明)
         ->function()... (代码执行)
        d:function d()... ()  (寻找函数声明,赋值)
      }
      首先看第一个a的输出:由于输出是在a=1之前,所以输出function a()
            第二个a的输出:在a=1之后,赋值完成,所以输出1,
            第三个a的输出:由于function a()在AO中已经赋过值,此时直接跳过,输出1
         b输出:function()...
   
   
最后有道题,小伙伴们自己分析分析,看看结果和自己想的是不是一样(提示要同时考虑GO与AO哦)
      a = 1;
      function test(e)
        function e();
        arguments[0] = 2;
        console.log(e);
        if(a)
          var b = 3;
        
        var c;
        a = 4;
        var a;
        console.log(b);
        f = 5;
        console.log(c);
        console.log(a);
      

      var a;
      test(1);
      console.log(a);
      console.log(f);
      最后结果是:2,undefined,undefined,4,1,5  看看你们的答案是否一致哦,加油!

      
 

以上是关于全局上下文GO与函数上下文AO的主要内容,如果未能解决你的问题,请参考以下文章

变量对象VO与活动对象AO

js - 基础 之 预编译总结

闭包(closure)

JavaScript高级部分概念用法

变量对象/变量提升

变量对象/变量提升