全局上下文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  看看你们的答案是否一致哦,加油!

      

 

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

时间: 2024-10-09 02:10:05

全局上下文GO与函数上下文AO的相关文章

JavaScript作用域、上下文环境、函数对象的定义与调用、匿名函数的定义与调用、闭包

提到闭包总给人很高深的感觉,网上的例子也数不胜数.但是我发现相当一部分并不容易理解.根据我的观察,是因为这些例子把标题中提到的概念糅杂在了一起,往往越看越糊涂.所以我希望化整为零,拆成简单例子来解释. 1.先看作用域: JavaScript作用域只有两种--全局作用域和函数内作用域,没有代码块作用域.示例: function loop(){ for(var i=0;i<5;i++){ //doSomething; } alert(i); } loop(); //执行函数结果为5. 尽管变量i已经

S1:函数上下文

函数的上下文是可以变化的,因此,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,总之,函数本身是独立的.可以通过Function对象上的call或者apply函数来修改函数的上下文: //定义一个全局的函数对象 function printName(){ return this.name; } //设置printName的上下文为jack, 此时的this为jack print(printName.call(jack)); //设置printName的

函数上下文

函数上下文 为什么: 确定this的指向谁 怎么做: this指向当前对象,确定当前对象是谁,要看上下文,看看是谁调用的, 点击法,中括号法调用的,this指向对象 obj.fn() obj['fn']()//fn中的this指向obj对象 单独执行方法的,this指向window 事件处理函数不一定是匿名函数,匿名函数只是简写 this指向谁 obj.fn() obj['fn']()//fn中的this指向obj对象 事件源 apply或call 为什么用这2个方法, 给方法的this指向对象

在尝试同步从控制器 的命名上下文 时出现 命名上下文要被删除或没有从指定的服务器上复制

在尝试同步从控制器 的命名上下文 时出现 命名上下文要被删除或没有从指定的服务器上复制 出现这个问题时 我们要等待一段时间,因为这个话的意思是 这里面的复制链接还没有齐全,等系统自动建立后,就可以复制正常了,那么用repadmin /showrepl 命令就可以查询到,应该会有对于一个的复制链接

CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒。

CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积.要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息当网速卡的时候就

1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This

参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p/32042645 Javascript 是一种单线程编程语言,这意味着它只有一个调用栈,call Stack(调用栈 ,,先入后出) 核心:对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This js原型链? 定义 原型对象也是简单的对象并且可以拥有它们自

__x__(63)0925第十天__ JavaScript 函数 上下文对象 原型对象

解析器在每次调用函数时,都会传递两个隐含参数: this    上下文对象 根据函数调用方式的不同,this 指向不同的对象 当作为普通函数调用时,this 指向全局对象 window 当作为对象的方法被调用时,this 指向调用该方法的对象 当作为构造函数调用时,this 指向创建的新对象 构造函数 出现的原因:由于目前为止,我们的对象都是用 new Object() 创建的,所以都是 Object 类的对象,不好区分...最好有个 Person 类,Animal 类 new Person()

函数上下文的判断

一.如果是函数名圆括号执行这个函数,函数的上下文就是window <script type="text/javascript"> var a=100; function myfun(a,b,c,d){ console.log(this.a);//100 var a=200; console.log(this.a)//100 console.log(a); //200 } myfun(); </script> 提示:①一定要记住,谁才有this的属性:是函数对象才

Spring Cloud上下文:应用程序上下文服务

Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点.Spring Cloud建立在此之上,并添加了一些可能系统中所有组件将使用或偶尔需要的功能. 引导应用程序上下文 一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文.开箱即用,负责从外部源加载配置属性,还解密本地外部配置文件中的属性.这两个上下文共享一个Environment,这是任何Spring应用程序