码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-07-04 14:30:23      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:赋值   简单的   log   global   efi   nbsp   活跃   形参   on()   

前几天在网上逛帖子的时候,看了几个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

标签:赋值   简单的   log   global   efi   nbsp   活跃   形参   on()   

原文地址:https://www.cnblogs.com/xsg1/p/11131908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!