当访问变量时,JavaScript引擎按以下顺序查找:
- 当前作用域:优先查找当前函数或块内的变量。
- 外层作用域:若当前作用域未找到,逐级向外层函数或块查找。
- 全局作用域:若所有外层作用域未找到,最后查找全局作用域。
- 未找到:抛出
undefined。
当查找一个变量时,真实的查找路径是沿着作用域链来查找
示例:
VO里边的作用域链除了包含本身(AO)外,还包含父级作用域(GO)
函数里边嵌套函数:
第一步:
除了之前的步骤,因为嵌套了函数会再次分配一块存储空间给bar
第二步:
给AO里边的内容赋值
第三步: 再创建一个函数上下文,开始执行bar里边的内容
第四步:
执行完成之后,会销毁函数上下文,AO
函数调用函数的作用域查找: 编译期间先创建全局对象,遇到函数会分配存储函数的空间
然后会执行代码来赋值,创建函数上下文
注意:函数的父级作用域是和定义的位置有关系,和在哪调用没有关系,在存储函数的时候就已经确定好父级作用域是什么了