美文网首页
作用域链

作用域链

作者: 橙子晓 | 来源:发表于2018-08-11 17:18 被阅读10次

作用域链是一个对象列表,上下文代码中出现的标识符将在这个列表中查找。

  • 原理:
  1. 当代码在一个环境中执行时,会创建变量对象的一个作用域链。
  2. 作用域的前端始终是当前执行的代码所在环境的变量对象:
    (1)如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即arguments对象(在全局环境中不存在)。
    (2)作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境,一直到全局执行环境。
    (3)全局执行环境的变量对象始终是作用域链中的最后一个对象。
  • 查找规则:
  1. 如果一个变量在函数自身作用域(在函数自身的变量/活动对象)中没有找到,那么就会查找父级函数(外层函数)的变量对象,以次类推。
  2. 当解析(查找)一个标识符的时候,会从作用域链中的活动对象开始查找,然后(如果这个标识符在函数自身的活动对象中没有被查找到)向作用域链的上一层查找
  • 作用:

保证对执行环境有权访问的所有变量和函数的有序访问。

  • 注意:

内部环境通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。

  • 例子:
  1. 代码:
    var a = 1;
    function fn1() {
        function fn2() {
            console.log(a);
        }
        function fn3() {
            var a = 4;
            fn2();
        }

        var a = 2;
        return fn3;
    }

    var fn = fn1();
    console.log(fn);
    fn();

分析:

  • console.log(fn);执行打印--fn()函数的操作,调用函数fn1(),进入函数内部,返回一个函数fn3()。
  • fn() -- 执行函数fn3(),在fn3()内部再调用了函数fn2(),进入fn2()的函数内部,console.log(a),构成了一条作用域链:
    (1)首先在fn2()执行环境中寻找a变量,a不存在;
    (2)然后顺着作用域链往上找,在fn1()函数的执行环境中寻找a变量,找到 var a = 2,然后直接打印 a = 2,不再往上去找a变量.

结果:

fn3() {
          var a = 4;
          fn2();
        }

2

相关文章

  • 作用域链和闭包

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

  • 作用域链

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

  • web性能实践

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

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

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

  • js 总结七07-19

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

  • 作用域和闭包

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

  • 2023-01-12

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

  • JavaScript 作用域链与闭包

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

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

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

  • 作用域链

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

网友评论

      本文标题:作用域链

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