美文网首页
作用域链

作用域链

作者: 靴唯白 | 来源:发表于2024-02-25 14:10 被阅读0次

在js中,函数存在一个隐式属性[[Scopes]],这个属性是用来保存当前函数的执行上下文环境,也是VO的一个集合,由于在数据结构上是链式的,因此也被称作是函数作用域链,我们可以把它理解为一个数组,可以理解为一系列的AO对象所组成的一个链式结构。
对于 AO 不清楚的同学,我也整理了一篇简易的文档,可以点击AO 或者移步主页查看。

function foo(){}
console.dir(foo)
隐式属性[[Scopes]]
  • 当函数被调用后
function foo(){
  console.dir(foo)
}
foo()

通过给 console.dir(foo)这一行代码打断点就可以清晰的看到 scope 下面分别有 local 和 global

函数被调用以后的[[Scopes]]

因此,我们可以得出一个结论:[[scopes]]属性在函数声明时产生,在函数调用时更新,在函数调用时,将该函数的AO对象压入到[[scopes]]中。

作用域链的作用

作用域链的作用是保证执行环境里面的有权访问的变量和函数是有序的,作用域的变量只能向上访问,变量对象访问到 window 对象即被终止,作用域链向下访问是不被允许的。

最直观的变现就是:
函数内部可以访问函数外部声明的变量

var a = 4
function foo(){
 console.log(a)
}
foo() // 4

函数外部不可以访问函数内部声明的变量

function foo(){
 var a = 4
}
foo() 
console.log(a)  // 报错  a is not defined

画出下面代码执行的作用域链

var global
function a(){
  var aa = 123
  function b(){
    var bb = 345
  }
  b()
}
a()
  • 第一步 a 定义


    a 定义
  • 第二步 a 执行


    a 执行
  • 第三步 b 定义
    没有 a 执行就不会有 b 定义,所以 b定义 和 a执行 是一样的


    b 定义
  • 第四步 b 执行


    b 执行
作用域链图示

相关文章

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • 作用域链

    作用域链 把多个作用域串起来便形成了作用域链;每个函数在初始化完成之后就拥有了各自的作用域链,但此时的作用域链中并...

  • web性能实践

    一. 作用域 前面我们了解作用域概念的以及作用域链是如何运作的。 随着作用域链中的作用域数量的增加,访问当前作用域...

  • JS_0: 执行环境和作用域链

    JavaScript,目前对于执行环境和作用域链的理解 什么是作用域链? 要讲作用域链就得先讲执行环境。 每个函数...

  • js 总结七07-19

    作用域 全局 局部 作用域链 闭包

  • 作用域和闭包

    作用域链 (据我所知)所有的编程语言都存在作用域链。整个代码存在全局作用域、函数作用以及块级作用域。 上述代码将会...

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • JavaScript 作用域链与闭包

    作用域链与闭包 了解作用域链之前需要先了解下作用域是什么。 作用域 几乎所有的语言都有作用域的概念。这是因为它们都...

  • 作用域/作用域链 闭包及其使用

    一、作用域、作用域链 作用域(scope) 浅显的理解: 作用域就是变量的可用范围(scope) 为什么要有作用域...

  • 作用域链

    作用域链(scope chain) 理解: 作用域链决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被...

网友评论

      本文标题:作用域链

      本文链接:https://www.haomeiwen.com/subject/gnhaadtx.html