执行上下文
-
执行上下文的概念
- 执行上下文是一个抽象概念,一个 js 代码运行环境的抽象概念
- 任何 js 代码都是运行在执行上下文里面的
- 变量或函数的执行上下文决定它们可以访问哪些数据,以及它们的行为
- 每个上下文都有一个关联的变量对象(variable object), 而这个上下文中定义的所有变量和函数都存在于这个对象上(这个变量对象是无法被代码访问到的)
-
全局上下文 全局上下文是最外层的上下文,在浏览器中指的就是 window 对象,所有用 var 定义的全局变量和函数都会挂在 window 上 但是,let 和 const 的顶级声明不会挂在全局上下文上
-
上下文栈
- 每一个局部作用域都有自己的上下文(不知道准不准确,js 高级编程中写的是每个函数),当代码执行流进入局部作用域时,这个局部作用域的上下文就会被推到一个上下文栈上
- 局部作用域的代码执行完成后,上下文栈就会 pop 这个局部作用域的上下文,这个上下文中定义的所有变量和函数就会被销毁
作用域链
- 上下文中的代码在执行的时候,会创建变量对象的一个作用域链(scope chain), 作用域链决定了各级上下文中的代码在访问变量和函数是的顺序
- 作用域链就是上下文变量对象的一个链条,栈顶上下文的变量对象就是作用域链的最前端,以此类推
作用域链增强
- try/catch: catch 创建了一个新的变量对象,直接用的
-
with: 往作用域链最前端强行添加一个对象
function buildUrl() { let qs = '?debug=true' with (location) { // 这里with把location强行放到作用域最前端了,所有href实际上是location.href let url = href + qs } return url }