We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
执行上下文决定了变量或函数可以访问那些数据,以及行为。
全局上下文是最外层的上下文,每个函数都有其自己的上下文。当代码执行流进入函数时,函数的上下文被推到一个上下文栈上。 在函数执行完之后,上下文栈会弹出该函数上下文,将控制权返还给之前的执行上下文。
执行上下文主要有全局上下文和函数上下文两种(eval()调用内部存在第三种上下文)
window
执行上下文栈
用来管理所有的执行上下文,首先是全局代码,所以最先开始初始化的是全局上下文然后将其压入栈中 碰到函数就会创建一个函数上下文并且压入栈中 当栈顶函数上下文执行完闭就会被弹出栈。直到程序结束,弹出全局上下文。
** 变量对象 Vo **
每个上下文都有一个关联的变量对象 这个上下文中定义的所有变量和函数都存在于这个对象上
** 活动对象 Ao **
在函数上下文中活动对象去用作变量对象。最初只有一个定义变量 arguments 。未进入执行阶段之前,变量对象(VO)中的属性都不能访问!但是进入执行阶段之后,变量对象(VO)转变为了活动对象(AO),里面的属性都能被访问了,然后开始进行执行阶段的操作。
执行上下文的生命周期分为三个阶段
在es6 环境中
创建阶段
确定this的值, 也就是绑定this
主要是介绍这两种
词法环境组件被创建
环境记录:存储变量(let 和 const )和函数声明的实际位置
对外部环境的引用: 用于访问其他外部词法环境
词法环境有两种类型: 全局环境 :拥有一个全局对象(window对象)及其关联的所有属性和方法, 同时也包含了用户自定义的全局变量. 但是全局环境中没有外部环境的引用, 也就是外部环境引用为null. 函数环境: 用户在函数中自定义的变量和函数存储在环境记录中, 包含了arguments对象. 而对外部环境的引用可以是全局环境, 也可以是另一个函数环境(比如一个函数中包含了另一个函数).
词法环境有两种类型:
null
arguments
变量环境组件被创建
需要注意:词法 环境和 变量 环境的区别在于前者用于存储**函数声明和变量( let 和 const )绑定,而后者仅用于存储变量( var )**绑定。
let
const
var
这里就可以看出执行上下文 是由 词法环境 和 变量环境 组成的
var a; var b = 1; let c = 2; const d = 3; function fn (e, f) { var g = 4; return e + f + g; } a = fn(10, 20);
//执行上下文 GlobalExectionContext = { // 全局执行上下文 ThisBinding: <Global Object>, LexicalEnvironment: { // 词法环境 EnvironmentRecord: { // 环境记录 Type: "Object", // 全局环境 c: < uninitialized >, d: < uninitialized >, fn: < func > }, outer: <null> // 外部环境引用 }, VariableEnvironment: { // 变量环境 EnvironmentRecord: { // 环境记录 Type: "Object", a: < uninitialized >, b: < uninitialized > }, outer: <null> } } FunctionExectionContext = { // 函数执行上下文 ThisBinding: <Global Object>, // this绑定window, 因为调用fn的是window对象 LexicalEnvironment: { // 词法环境 EnvironmentRecord: { // 环境记录 Type: "Object", // 函数环境 Arguments: { 0: 10, 1: 20, length: 2 } }, outer: < GlobalLexicalEnvironment > // 全局环境的引用 }, VariableEnvironment: { // 变量环境 EnvironmentRecord: { // 环境记录 Type: "Object", g: < uninitialized > }, outer: < GlobalLexicalEnvironment > // 全局环境的引用 } }
执行阶段
销毁阶段
在ES5 环境下
执行上下文的分为三个阶段
分析阶段:
当进入执行上下文时,这时候还没有执行代码,
变量对象会包括:
决定 了各级上下文中的代码在访问变量和函数时的顺序。和执行上下文栈的概念相似。
js执行上下文
JavaScript深入之词法作用域和动态作用域
[推荐看看](https://github.com/mqyqingfeng/Blog/issues/5)
JavsScript 变量提升和函数提升 - 写的非常不错
JS-变量提升和函数提升
The text was updated successfully, but these errors were encountered:
No branches or pull requests
执行上下文
执行上下文决定了变量或函数可以访问那些数据,以及行为。
全局上下文是最外层的上下文,每个函数都有其自己的上下文。当代码执行流进入函数时,函数的上下文被推到一个上下文栈上。 在函数执行完之后,上下文栈会弹出该函数上下文,将控制权返还给之前的执行上下文。
执行上下文主要有全局上下文和函数上下文两种(eval()调用内部存在第三种上下文)
执行上下文的特点
window
对象;执行上下文栈
用来管理所有的执行上下文,首先是全局代码,所以最先开始初始化的是全局上下文然后将其压入栈中 碰到函数就会创建一个函数上下文并且压入栈中 当栈顶函数上下文执行完闭就会被弹出栈。直到程序结束,弹出全局上下文。
** 变量对象 Vo **
每个上下文都有一个关联的变量对象 这个上下文中定义的所有变量和函数都存在于这个对象上
** 活动对象 Ao **
在函数上下文中活动对象去用作变量对象。最初只有一个定义变量 arguments 。未进入执行阶段之前,变量对象(VO)中的属性都不能访问!但是进入执行阶段之后,变量对象(VO)转变为了活动对象(AO),里面的属性都能被访问了,然后开始进行执行阶段的操作。
执行过程
执行上下文的生命周期分为三个阶段
创建阶段
确定this的值, 也就是绑定this
主要是介绍这两种
词法环境组件被创建
环境记录:存储变量(let 和 const )和函数声明的实际位置
对外部环境的引用: 用于访问其他外部词法环境
变量环境组件被创建
执行阶段
销毁阶段
执行上下文的分为三个阶段
创建阶段
执行阶段
销毁阶段
分析阶段:
当进入执行上下文时,这时候还没有执行代码,
变量对象会包括:
作用域链
决定 了各级上下文中的代码在访问变量和函数时的顺序。和执行上下文栈的概念相似。
参考
js执行上下文
JavaScript深入之词法作用域和动态作用域
[推荐看看](https://github.com/mqyqingfeng/Blog/issues/5)
JavsScript 变量提升和函数提升 - 写的非常不错
JS-变量提升和函数提升
The text was updated successfully, but these errors were encountered: