执行上下文与执行上下文栈

1. 变量提升与函数提升

①  变量声明提升:通过var 定义(声明)的变量,在定义语句之前就可以访问到,值为undefined;
②  函数声明提升:通过function声明的函数,在之前就可以直接调用,值:函数定义(对象)

1.1 代码体验

注意只有通过function声明的函数才具有提升功能,通过赋值操作设置的函数表达式并不具有,只能在声明函数后,才可进行调用,如上述代码中的函数fn3,不可在前调用。

那么问题来了:变量提升和函数提升是如何产生的呢?这就涉及到执行上下文的相关知识了...

2. 执行上下文

JS代码根据位置可以分为:全局代码 和 函数(局部)代码。从而执行上下文也就分为全局执行上下文和函数执行上下文。

2.1 全局执行上下文

① 在执行全局代码前,将window确定为全局执行上下文
② 对全局数据进行预处理(预解析):

  1)var定义的全局变量==> undefined,添加为window的属性
  2)function声明的全局函数==>赋值(fun),添加为window的方法
  3)this==>赋值(window)

③ 开始执行全局代码

2.2 函数执行上下文

① 在调用函数,准备执行函数体之前创建对应的函数执行上下文对象(虚拟的,存在于栈中)
② 对局部数据进行预处理(预解析):

  1)形参变量==>赋值(实参)==>添加为执行上下文的属性
  2)arguments==>赋值(实参列表),添加为执行上下文的属性
  3)var定义的局部变量==> undefined,添加为执行上下文的属性
  2)function声明的函数==>赋值(fun),添加为执行上下文的方法
  3)this==>赋值(调用函数的对象)

③ 开始执行函数体代码

2.3 代码体验

3. 执行上下文栈

① 在全局代码执行前JS引擎就会创建一个栈存储管理所有的执行上下文对象
② 在全局执行上下文(window)确定后,将其添加到栈中(压栈),window永远放在栈的最底层
③ 在函数执行上下文创建后,将其添加到栈中(压栈)
④ 在当前函数执行完后,将栈顶的对象移除(出栈)
③ 当所有的代码执行完后,栈中只剩下window

执行上下文与执行上下文栈_第1张图片

 3.1 代码体验

执行上下文栈中的执行顺序图:

执行上下文与执行上下文栈_第2张图片

注意:

① 每调用一次函数,就会对应产生这个函数的执行上下文对象;

② 函数执行完函数体代码后,就会被销毁,即从内存中消失,也就不再存在于上下文执行栈中,即出栈。

你可能感兴趣的:(JavaScript提高,前端,javascript,开发语言)