作用域

作者: 小豆soybean | 来源:发表于2021-08-20 17:45 被阅读0次

    函数存在scope属性。
    原文链接:https://www.cnblogs.com/zhimao/p/15061102.html

    1. 作用域

    作用域是指程序源代码中定义的范围

    作用域规定了如何设置变量,也就是确定当前执行代码对变量的访问权限

    JavaScript采用词法作用域,也就是静态作用域

    1.1 词法作用域

    所谓词法作用域, 是指函数的作用域在函数的定义时就已经确定了

    示例

    var value = 1;
    
    function foo() {
        console.log(value);
    }
    
    function bar() {
        var value = 2;
        foo();
    }
    
    bar();   // 1
    
    

    2. 作用域链

    js中, 函数存在一个隐式属性 [[scopes]], 这个属性用来保存当前函数的执行上下文环境, 由于在数据结构上是链式的, 因此也被称作是作用域链, 我们可以把它理解为一个数组

    可以理解为是一系列的AO对象所组成的一个链式结构

    函数存在[[scopes]]属性

    function a() {}
    
    console.dir(a) // 打印内结构
    
    
    image

    当函数被调用后

    function a() {
      console.dir(a);
    }
    // 调用函数
    a()
    
    
    image

    因此我们可以得出一个结论: [[scopes]] 属性在函数声明时产生, 在函数调用时更新

    即: 在函数被调用时, 将该函数的AO对象压入到[[scopes]]中

    3. 作用域链的作用

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

    最直观的表现就是:

    • 内部函数可以使用外部函数声明的变量

    示例

    function a() {
      var i = 100
      function b() {
        console.log(i);
      }
      b()
    }
    a()     // 100
    
    
    • 外部函数不可以使用内部函数声明的变量

    示例

    function a() {
      var i = 100
      function b() {
        var i = 200
        console.log(i);
      }
      b()
    }
    a()     // 200
    
    

    仅记录自己的学习总结,如有错误,还请评论指正~

    相关文章

      网友评论

          本文标题:作用域

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