JS作用域/作用域链/变量提升----3

作用域

作用域指一个变量的作用的范围                  作用范围==作用域         

作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。

例如:

  function show(){
  var a='局部变量'
  }
  show()
  console.log(a);//a is not defined

在 JavaScript 中有两种作用域类型:

(1)全局作用域

(2)局部作用域(函数作用域 )

全局作用域

直接写在 script 标签中的 JavaScript 代码都是全局作用域。当页面打开运行时全局作用域就会自动创建,而当页面关闭时就会销毁。在全局作用域中有一个全局的 window 对象可以使用,而所有全局作用域对象都会作为 window 对象的属性来使用。(为什么全局变量不会销毁,因为js执行时从上往下执行,不清楚在下面的代码中这变量有没有使用)

<script>
        let a = '全局作用域'
        console.log(a);
    </script>
  

在js代码里这个a不论在哪里都可以使用,使用完了之后,他还是存在,这种情况,变量a为全局变量

局部作用域(函数作用域)

作用于函数内的代码环境,就是局部作用域。由于跟函数有关,所以也称为函数作用域。

局部作用域(函数作用域)是在调用函数时才会被创建,函数执行完毕后就自动销毁同时,每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
在函数作用域中可以访问全局作用域,而在全局作用域中不能访问函数作用域。当在函数作用域中使用一个变量时,它会先在自身作用域内查找,如果找到就直接使用,如果没有找到则会向上一级作用域查找,直到找到全局作用域为止。如果都没有找到则会报错。
function show(){
  let a='局部作用域'
  }
  show()
  console.log(a);//a is not defined
  

当直接赋值没有声明的时候,这个变量会自动成为全局变量

 function a() {
    b = 10
  }
  a()
  console.log(b);

作用链

作用域的集合就是作用域链(子集可以访问父集,父集不能访问子集)

 function fn() {
    var a=1
    function fn1() {
      var b=2
      console.log(a);//1
      function fn2() {
          console.log(a);//1
          console.log(b);//2
      }
      fn2()
    }
    fn1()
   }
 fn()
 console.log(a);//a is not defined

从作用域链的结构可以看出,函数在执行的过程中,先从自己内部寻找变量,如果找不到,再从创建当前函数所在的作用域去找,从此往上,也就是向上一级找,直到找到全局作用域还是没找到。

作用域代码优化:在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。所以在编写过程中,尽量的使用局部变量,少使用全局变量

执行顺序:就近原则

var a=10;
function fn(){
    var a=20;
    console.log(a) //20
}
fn()

 

posted @ 2022-06-20 16:20  长安·念  阅读(43)  评论(0)    收藏  举报