一.什么是执行上下文
1.执行上下文
当执行一段代码的时候, JavaScript 引擎会首先进入一个准备阶段, 准备阶段结束后才会进入代码执行阶段, 我们称这个准备阶段为
执行上下文, 执行上下文包含了三种全局执行环境,函数体执行环境,eval 代码(不清楚)
举个例子:
var name = "科比"; //全局执行上下文
function sayName() { //当调用sayName()的时候会产生 函数执行上下文
console.log(naem);
}
谈到执行上下文需提到另外一个概念就是变量对象
2.变量对象
高级程序设计三中对变量对象的描述:
每个执行环境(执行上下文)都有一个与之关联的变量对象,执行环境(执行上下文)中定义的
所有变量和函数都保存在这个对象中.
这个变量对象都包含写什么呢?
当进入执行上下文时, 这时候还没有执行代码, 变量对象会包括:
- 变量、 函数表达式—— 变量声明, 默认赋值为 undefined;
- this—— 赋值;
- 函数声明—— 赋值;
- 如果是在函数的执行环境中, 变量对象还会包含
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
参考: