JavaScript - 数据的作用域

97 阅读2分钟
  1. JS有两种作用域:全局作用域和函数作用域:

    • 全局定义的变量和函数都在全局作用域中。

      var a = 1;
      function b() {};
      var c = function () {}; // 全局作用域中的变量c,这是将函数的地址存到c中
      c();
      
    • 在函数中定义的变量和函数都在函数作用域中。

      function b() {
          var d = 2; // 函数作用域中的变量d
      };
      var c = function () {
          var e = 3; // 函数作用域中的变量e
      };
      
    • 内部的作用域能访问外部的作用域,反之不行。访问时从内向外依次查找。

      var a = 1;
      function b() {
          var c = 0;
          function d() {
              console.log(a); // 1,函数作用域d中没有,到函数作用域b中找,函数作用域b中没有,到全局作用域中找
          };
          d();
      };
      console.log(c); // 报错 ReferenceError: c is not defined,全局作用域无法访问函数作用域b中的变量c
      
    • 如果在内部的作用域中访问了外部的变量就会产生闭包。

    • 内部作用域访问的是哪个外部变量,取决于函数定义的位置,和调用无关。

      var a = 1;
      function m() {
          a++;
      };
      function m2() {
          var a = 3;
          m(); // 函数m中的a++,加的是全局作用域中的a,因为函数m定义在全局作用域中
          console.log(a); // 3
      };
      m2();
      console.log(a); // 2
      
  2. 作用域内定义的变量、函数声明会提升到作用域顶部。

【练习题】

  1. 下面代码输出的是什么?

    console.log(a, b, c);
    var a = 1;
    var b = function() {};
    function c() {};
    

    答案: undefined undefined [Function: c]

    var a;
    var b;
    function c() {};
    console.log(a, b, c);
    a = 1;
    b = function() {};
    
  2. 下面代码输出的是什么?

    var a = 1, b = 2;
    function m1() {
        console.log(a);
        var a = 3;
        function m2() {
            console.log(a, b);
        };
        m2();
    };
    m1();
    

    答案:

    undefined

    3 2

    var a;
    var b;
    function m1() {
        var a;
        function m2() {
            console.log(a, b);
        };
        console.log(a);
        a = 3;
        m2();
    };
    a = 1;
    b = 2;
    m1();
    
  3. 下面代码输出的是什么?(百度)

    var a = 1;
    function m1() {
        a++;
    };
    function m2() {
        var a = 2;
        m1();
        console.log(a);
    };
    m2();
    console.log(a);
    

    答案: 2 2

    var a;
    function m1() {
        a++;
    };
    function m2() {
        var a;
        a = 2;
        m1(); // 加的是全局作用域中的a
        console.log(a);
    };
    a = 1;
    m2();
    console.log(a);
    
  4. 下面代码输出的是什么?

    function m1() {
        console.log(a);
    };
    function m2() {
        var a = 2;
        m1();
        console.log(a);
    };
    m2();
    var a = 1;
    console.log(a);
    

    答案:

    undefined

    2 1

    var a;
    function m1() {
        console.log(a);
    };
    function m2() {
        var a;
        a = 2;
        m1();
        console.log(a);
    };
    m2();
    var a = 1;
    console.log(a);