zoukankan      html  css  js  c++  java
  • Javascript之执行上下文

    一.什么是执行上下文

    1.执行上下文

    当执行一段代码的时候, JavaScript 引擎会首先进入一个准备阶段, 准备阶段结束后才会进入代码执行阶段, 我们称这个准备阶段为
    执行上下文, 执行上下文包含了三种全局执行环境,函数体执行环境,eval 代码(不清楚)
    举个例子:

     var name = "科比"; //全局执行上下文
    
      function sayName() { //当调用sayName()的时候会产生 函数执行上下文
        console.log(naem);
      }
    

    谈到执行上下文需提到另外一个概念就是变量对象

    2.变量对象

    高级程序设计三中对变量对象的描述:
    每个执行环境(执行上下文)都有一个与之关联的变量对象,执行环境(执行上下文)中定义的
    所有变量和函数都保存在这个对象中.

    这个变量对象都包含写什么呢?

    当进入执行上下文时, 这时候还没有执行代码, 变量对象会包括:

    1. 变量、 函数表达式—— 变量声明, 默认赋值为 undefined;
    2. this—— 赋值;
    3. 函数声明—— 赋值;
    4. 如果是在函数的执行环境中, 变量对象还会包含
      arguments 对象 和参数

    下边例子来解释一下上边所说的

      function foo(a) {
        var b = 2;
    
        function c() {}
        var d = function () {};
    
        b = 3;
    
      }
      foo(1);
      // 在进入执行上下文的时候
      // 此时变量对象都包含如下内容
      {
        arguments: { //函数的参数对象
          0: 1,
          length: 1
        },
        a: 1, //传的参数
        b: undefined, //定义的变量
        c: function c() {}, //函数声明
        d: undefined // 函数表达式
      }
    

    如果函数声明和变量声明名字重复了会怎么操作呢?

      // 例如:
      console.log(foo);
    
      function foo() {
        console.log("foo");
      }
    
      var foo = 1;
      //   会打印函数,而不是 undefined 。
    

    这是因为在进入执行上下文时,首先会处理函数声明,其次会处理变量声明
    如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。

    总结:

    给执行上下文环境下一个通俗的定义——在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用 undefined 占个空。

    问题:每次函数的调用都会产生执行山下问,这么多上下文环境该如何管理,以及如何销毁而释放内存呢?

    这里需要提到另外一个概念: 执行上下文栈

    执行上下文栈用来管理执行上下下文

    例子:

      var name = "科比"; //全局执行上下文
    
      function sayName() {
        console.log(this.name);
    
      }
      sayName();
    

    首先栈里会存入 全局上下文, 函数调用会存入函数执行上下文, 执行完代码后, 函数的执行上下文会被销毁

    需要了解执行栈详细信息的可以参考:https://www.cnblogs.com/wangfupeng1988/p/3989357.html

    参考:

  • 相关阅读:
    Core Api跨域问题解决
    文件夹浏览权限
    反射(C#基础回顾04)
    二维码扫码问题
    MVC接口跨域问题
    27.用户注册场景:数据验证(2):自定义验证tag、正则验证
    26.用户注册场景:数据验证(1):第三方验证库、自定义错误信息
    25.引入gorm,用户数据入库
    24.场景练习,基本接口(用户注册接口)
    22.使用Micro为我们的rpc服务创建http api网关
  • 原文地址:https://www.cnblogs.com/heyushuo/p/9955013.html
Copyright © 2011-2022 走看看