内容整理来自:js执行上下文与作用域_哔哩哔哩_bilibili
执行上下文:
- js在执行语句前,经过了一些 “准备”,为代码执行创造文本环境,文本环境记录了所有的变量名、函数名、类名等。
执行上下文存放在执行栈(Excution Context Stack)中 ,先进后出
- 执行栈栈顶的执行上下文称为当前执行上下文
- JS 代码总是在当前上下文中运行
- 意思是 JS 代码中需要用到的资源,到当前执行上下文上查找
4种情况会创建新的执行上下文:
- 进入全局代码
- 进入 function 函数体代码
- 进入 eval 函数参数指定的代码
eval ( js 表达式 / 变量 / 语句 ):函数计算或执行参数
- 进入 module 代码 (引入或导入模块的时候)
首先需要知道什么是 全局对象 、作用域?
js 的全局对象:
是一个对象,作为全局函数和全局属性的占位符,通过全局对象可以访问到所有预定义的对象、函数、属性。在 js 中可以使用 this 关键词引用全局对象,但通常不需要这样引用,全局对象就是 window 对象,
例如:var a='aa' 输出可以直接输出 a 也可以 window.a
js 的作用域:
- 全局作用域:函数外定义的变量 就是在全局变量,在函数中也能调用
- 局部作用域:定义在函数内的变量 就是局部变量,函数外无法调用
这里只说 全局上下文 和 函数上下文 的运作过程
// js 执行流程: 先到全局作用域中找变量,找不到再去全局对象中查找
// var 和 function 声明创建在全局对象中,
var a='aa'
console.log(a) // aa
console.log(window.a) // aa
// var 定义的变量 两个输出都是输出的 全局对象中的
// let const class 声明的变量创建在全局作用域(scope)中
let a='aa'
console.log(a) // aa ,这里输出的是作用域中的
console.log(window.a) // undefined 全局对象中没有