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

参考:

原文地址:https://www.cnblogs.com/heyushuo/p/9955013.html