fe-interview
fe-interview copied to clipboard
[js] 第161天 说说你对执行上下文的理解
第161天 说说你对执行上下文的理解
执行上下文就是运行Javascript代码的环境。
执行上下文相当于当前代码的一个运行环境。 一般执行上下文会以栈的形式在执行栈中存储。 栈顶的执行环境可以访问到整个栈中的变量。
let a,b; //全局上下文
a = function(x){
console.log(x);
b(x+3) //进入b上下文
}
b=function(x){
let c=1;
console.log(x+c) //a,b上下文出栈,回到全局上下文
}
a(1) // 进入a上下文
所有的上下文实际是个存储对象, 比如层级上下文是存储元素才界面中的层级关系的, 执行上下文自然存储的是执行相关的数据关系。
首先,执行顺序,如上文所说是栈的形式,调用就放入,执行完就弹出。
其次,执行上下文存了些啥,存的是运行上下文, 那运行上下文又存了啥,主要是变量对象、作用域链、this 这三类。 变量对象AO包括函数上下文,函数上下文又包含局部变量、函数形参(arguments); 作用域链,即 [[Scope]] 属性,会将调用方的运行上下文链接一下; 再搞个 this,在执行时从作用域链里取,何其方便。
所以一个函数运行时,可能这样的:
function func(a) { var b = 0; console.log(this); }
func('xxx');
// 假设以下为执行上下文,即将压入调用栈
'func': {
AO: {
arguments: {
a: 'xxx',
length: 1
},
b: 0
},
[[Scope]]: [AO, window.AO]
}
- 上下文是JS的运行栈,js在进出作用域时,就会形成不同的上下文环境
- 上下文环境的作用是存储当前作用域的值
- 与作用域不同,上下文环境是在代码运行时形成的
- 闭包时,出栈时,上下文并不会消失
var a = 1; // 全局作用域
function foo () {
// foo作用域
const innerFuc = x => {
// innerFuc作用域
x++;
return x;
}
return innerFuc() + a;
}
foo();
执行上下文可以理解为当前代码的一个执行环境,每个函数的执行都会创建一个新的执行上下文,分全局执行上下文、函数执行上下文。