关于作用域链

作用域

先来谈谈变量的作用域
变量的作用域无非就是两种:全局变量和局部变量。
全局作用域:
最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的:

<script>
      var outerVar = "outer";
      function fn(){
         console.log(outerVar);
      }
      fn();//result:outer
   </script>

局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部

<script>
      function fn(){
         var innerVar = "inner";
      }
      fn();
      console.log(innerVar);// ReferenceError: innerVar is not defined
</script>

需要注意的是,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

作用域链(Scope Chain)

那什么是作用域链?
当我们在局部作用域中,访问一个变量时,系统首先会在当前作用域中寻找变量var的声明语句,如找到则直接使用。反之,则继续向上一级作用域中寻找var的声明语句,如找到则直接使用,反之,继续向上一级作用域中去寻找…直到全局作用域,如找到则直接使用,如未找到则直接在全局作用域中声明该变量,我们把这种链式查询关系就称之为为作用域链!

    // 全局作用域: script标签包裹的内容就是一个作用域
    var abc = 123;
    // fn 中能访问到的变量由那些:
    // 1 自身定义的变量
    // 2 上一级作用域中的变量(全局作用域)

    // foo 中能访问到的变量由那些:
    // 1 自身定义的变量
    // 2 函数fn中的变量
    // 3 全局作用域中的变量
    function fn() {
        var a = 456;

        function foo() {
            var num = 123;

            // f的作用域链: f作用域 -> foo作用域 -> fn作用域 -> 全局作用域
            function f() {}
        }
        foo();
        // console.log(num);
    }

注意

  • 函数在执行的过程中,先从自己内部找变量
  • 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
  • 注意找的是变量的当前的状态
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • js的作用域链是由当前执行环境下的变量对象以及上层的执行环境下的变量对象组成,它保证了当前执行环境对符合访问它的权...
    a4316976150e阅读 2,600评论 0 0
  • 前言 对于js中的闭包,无论是老司机还是小白,我想,见得不能再多了,然而有时三言两语却很难说得明白,反正在我初学时...
    itclanCoder阅读 9,634评论 1 11
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,698评论 0 13
  • 01 前两天,在网上花钱买了一节关于怎样掌控悲观情绪直播课听了听,收益匪浅。一向听课不怎么爱做笔记的我居然打破了以...
    肖先生肖军阅读 9,760评论 1 9
  • 恍然不觉春来到,细思相识已遥遥。 冰冰化作春风雨,润物无声建心桥。 日日相知亦相守,酸甜苦辣全知晓。 唯愿君心似我...
    曼曼冰冰阅读 903评论 1 1