作用域

  • 作用域指一个变量的作用范围
  • 在 JS 中一共由两种作用域:

    全局作用域

  • 直接编写在 script 标签中的 JS 代码,都在全局作用域

  • 全局作用域在页面打开时创建,在页面关闭时销毁
  • 在全局作用域中有一个浏览器的窗口,它由浏览器创建,我们可以直接使用
  • 在全局作用域中:
    • 创建的变量都会作为 window 对象的属性保存
    • 创建的函数都会作为 window 对象的方法保存
  • 全局作用域中的变量都是全局变量
    • 在页面中的任意位置都可以访问的到。

函数作用域

  • 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
  • 每调用一次函数就会创建一个新的函数作用域,它们之间是互相独立的
  • 在函数作用域中可以访问到全局作用域的变量
  • 在全局作用域中无法访问到函数作用域的变量

    1. function fun(){
    2. // console.log(a);
    3. var a = 20;
    4. }
    5. fun();
    6. console.log(a); // 报错:Uncaught ReferenceError: a is not defined
  • 当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有则使用

    • 如果没有则向上一级作用域中寻找,直到找到全局作用域
    • 如果全局作用域中依然没有,则报错:ncaught ReferenceError: a is not defined
      var a = 10;
      function fun(){
      var a = 20;
      console.log(a);
      function fun2(){
         console.log(a);
      }
      fun2();  // 20
      }
      fun();  // 20
      
  • 在函数中要访问全局变量可以使用 window 对象

    var a = 10;
    function fun(){
      var a = 20;
    console.log(window.a);
    }
    fun();  // 10
    
  • 在函数作用域也有声明提升的特性

    • 使用 var 关键字声明的变量,会在函数中所有的代码执行之前被声明
      function fun(){
      console.log(a);
      var a = 10;
      }
      fun();  // undefined
      
  • 函数声明也会在函数中所有的代码执行之前执行

    function fun(){
      console.log(a);
    var a = 10;
    fun2();
    function fun2(){
        console.log("我是函数声明的函数");
    }
    }
    fun();  // undefined  我是函数声明的函数
    
  • 在函数中,不使用 var 声明的变量都会成为全局变量

    var a = 10;
    function fun(){
      a = 20;
      console.log(a);
      b = 30;
    }
    fun();  // 20
    console.log(b);  // 30
    
  • 定义形参就相当于在函数作用域中声明了变量

    function fun(a){
      var a;
    }
    fun();  // undefined