JavaScript 局部变量和外部变量(ES6以前)

102 阅读2分钟

局部变量和外部变量

  • 在JavaScript(ES5之前)中没有块级作用域的概念,但是函数可以定义自己的作用域。

    • 作用域(Scope)表示一些标识符的作用有效范围(所以也有被翻译为有效范围的);
    • 函数的作用域表示在函数内部定义的变量,只有在函数内部可以被访问到;
  • 外部变量和局部变量的概念:

    • 定义在函数内部的变量,被称之为局部变量(Local Variables)。
    • 定义在函数外部的变量,被称之为外部变量(Outer Variables)。
  • 什么是全局变量?

    • 在函数之外声明的变量(在script中声明的),称之为全局变量。
    • 全局变量在任何函数中都是可见的。
    • 通过var声明的全局变量会在window对象上添加一个属性(了解);
  • 在函数中,访问变量的顺序是什么呢?

    • 优先访问自己函数中的变量,没有找到时,在外部中访问。(就近原则
  • 关于块级作用域、作用域链、变量提升、AO、VO、GO等概念我们后续将进行学习。

  • 关于上面说的只有函数代码块有自己的作用域请看如下例子:

    // 1.作用域的理解:message在哪一个范围内可以被使用, 称之为message的作用域(scope)
    // 全局变量: 全局作用域
    var message = "Hello World"
    if (true) {
      console.log(message)
    }
    function foo() {
      console.log("在foo中访问", message)
    }
    foo()
    
    // 2.ES5之前是没有块级作用域(var定义的变量是没有块级作用域)
    {
      var count = 100
      console.log("在代码块中访问count:", count)
    }
    console.log("在代码块外面访问count:", count)  // -----可以访问
    // for循环的代码块也是没有自己的作用域
    for (var i = 0; i < 3; i++) {
      var foo = "foo"
    }
    console.log("for循环外面访问foo:", foo) // ------可以访问
    console.log("for循环外面访问i:", i) // 3
    
    // 3.ES5之前函数代码块是会形成自己的作用域
    // 意味着在函数内部定义的变量外面是访问不到的
    function test() {
      var bar = "bar"
    }
    test()
    console.log("test函数外面访问bar:", bar)  // ---报错,变量未定义,访问不了
    
    // 函数有自己的作用域: 函数内部定义的变量只有函数内部能访问到
    function sayHello() {
      var nickname = "kobe"
      console.log("sayHello函数的内部:", nickname)
      
      function hi() {
        console.log("hi function~")
        console.log("在hi函数中访问nickname:", nickname)
      }
      hi()
    }
    sayHello()
    console.log("sayHello外面访问nickname:", nickname)  // -----不能访问