文章目录
一、执行上下文与作用域
变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为
- 全局上下文是最外层的上下文
- 在浏览器中,全局上下文就是我们常说的 window 对象,因此所有通过 var 定义的全局变量和函数都会成为 window 对象的属性和方法
- 使用 let 和 const 的顶级声明不会定义在全局上下文中,但在作用域链解析上效果是一样的
- 上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数(全局上下文在应用程序退出前才会被销毁,比如:关闭网页或退出浏览器)
- 每个函数调用都有自己的上下文
上下文代码在执行的时候,会创建变量对象的一个作用域链
这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序(先在局部找,没有,就延作用域向父级作用域找)
内部上下文可通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部的任何东西
代码正在执行的上下文的变量对象始终位于作用域链的最前端,全局上下文的变量对象始终是作用域链的最后一个变量对象
var color ="blue";functionfn1(){let people ="张三"functionfn2(){let age =18;//这里可以访问到 age、people、color}// 这里可以访问到 people、color ,但访问不到 agefn2()}// 这里可以访问到 color ,但访问不到 age、peoplefn1()
- 对于 javascript 最外层的代码(不包含任何函数定义内的代码),其作用域链只包含一个对象:即全局对象
- 对于不包含嵌套函数的函数,其作用域链包含两个对象:其自身的变量对象和全局变量对象
- 对于包含了嵌套函数的函数,其作用域包含至少三个对象:自身的变量对象,外层的(将自身嵌套的)变量对象,全局变量对象
二、作用域链增强(with、try/catch)
某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执行后会被删除
通常在两种情况下会出现这个现象:
- try/catch 语句的 catch 块
对于 catch 语句而言,会创建一个新的变量对象,这个变量对象会包含要抛出的错误对象的声明
- with 语句
对于 with 语句来说,会向作用域链前端添加指定的对象
版权归原作者 每天内卷一点点 所有, 如有侵权,请联系我们删除。