执行上下文
什么是执行上下文?它定义了变量、函数的作用域以及代码的执行环境。下面将详细介绍执行上下文的相关内容 说到执行上下文那么以下几个概念不得不提及:
- 执行上下文栈
- 变量对象
- 作用域链
- this
执行上下文栈
### 执行上下文栈
对 JavaScript 代码的执行流程起着至关重要的作用。
每当 JavaScript 代码开始执行时,会创建一个全局执行上下文并将其压入执行上下文栈。之后,每调用一个函数,就会创建一个新的函数执行上下文并将其压入栈顶。当函数执行完毕后,该函数的执行上下文会从栈中弹出,控制权回到调用该函数的执行上下文。
说白了就是管理js代码执行流程。
以下两段代码可以更好的理解执行上下文栈
```var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
结果都是local scope ,但是两段代码的执行上下文栈是不同的
第一段代码:
- ECStack.push(checkscope())
- ECStack.push(f())
- ECStack.pop(f())
- ECStack.pop(checkscope)
第二段代码执行顺讯
- ECStack.push(checkscope())
- ECStack.pop(checkscope)
- ECStack.push(f())
- ECStack.pop(f())
这两段代码都是在ECStack.push(f())的时候将局部变量 scope进行赋值为 local scope
变量对象
变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明。
-
在全局上下文中,变量对象就是全局对象,在全局对象中内置了很多的方法,比如 parseInt()等。
-
在函数上下文中,我们用活动对象(activation object, AO)来表示变量对象。
活动对象和变量对象其实是一个东西,只是变量对象是规范上的或者说是引擎实现上的,不可在 JavaScript 环境中访问,只有到当进入一个执行上下文中,这个执行上下文的变量对象才会被激活,所以才叫 activation object 呐,而只有被激活的变量对象,也就是活动对象上的各种属性才能被访问。
活动对象是在进入函数上下文时刻被创建的,它通过函数的 arguments 属性初始化。arguments 属性值是 Arguments 对象。
函数定义时,也就是函数进入执行上下文后。变量对象包括:函数的所有形参 (如果是函数上下文)、函数声明、变量声明
代码执行时,会顺序执行代码,根据代码,修改变量对象的值
作用域链
作用域链是什么: 当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。