fe-interview icon indicating copy to clipboard operation
fe-interview copied to clipboard

[js] 第161天 说说你对执行上下文的理解

Open haizhilin2013 opened this issue 5 years ago • 5 comments

第161天 说说你对执行上下文的理解

haizhilin2013 avatar Sep 23 '19 20:09 haizhilin2013

执行上下文就是运行Javascript代码的环境。

NicholasBaiYa avatar Sep 24 '19 00:09 NicholasBaiYa

执行上下文相当于当前代码的一个运行环境。 一般执行上下文会以栈的形式在执行栈中存储。 栈顶的执行环境可以访问到整个栈中的变量。

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上下文

LinStan avatar Sep 24 '19 01:09 LinStan

所有的上下文实际是个存储对象, 比如层级上下文是存储元素才界面中的层级关系的, 执行上下文自然存储的是执行相关的数据关系。

首先,执行顺序,如上文所说是栈的形式,调用就放入,执行完就弹出。

其次,执行上下文存了些啥,存的是运行上下文, 那运行上下文又存了啥,主要是变量对象作用域链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]
}

forever-z-133 avatar Sep 24 '19 12:09 forever-z-133

  • 上下文是JS的运行栈,js在进出作用域时,就会形成不同的上下文环境
  • 上下文环境的作用是存储当前作用域的值
  • 与作用域不同,上下文环境是在代码运行时形成的
  • 闭包时,出栈时,上下文并不会消失
var a = 1; // 全局作用域
function foo () {
    // foo作用域
    const innerFuc = x => {
        // innerFuc作用域
        x++;
        return x;
    }
    return innerFuc() + a;
}
foo();

vkboo avatar Sep 24 '19 13:09 vkboo

执行上下文可以理解为当前代码的一个执行环境,每个函数的执行都会创建一个新的执行上下文,分全局执行上下文、函数执行上下文。

xiaoqiangz avatar Jul 27 '22 09:07 xiaoqiangz