理解JavaScript的变量,变量作用域,作用域链

1. JavaScript的变量分为两种

  • 全局变量(Global variable):可以在脚本的任何位置被引用。

  • 局部变量(Local variable):只存在于声明它的那个函数的内部,这个函数之外是无法引用的。

2. 关键字var设定了变量的作用域

  • 使用var声明变量那么这个变量就是局部变量。JavaScript的全局变量是全局对象的属性。
    当使用var声明一个变量时,这个变量时无法通过delete运算符删除的。如:
    var m =1;   //t是一个不可删除的全局变量
    n = 2;  //创建全局对象的一个可删除的属性
    this.t = 3; //创建全局对象的一个可删除的属性

    delete m//false:变量没有被删除
    delete n//true:变量被删除了
    delete this.t  //true:变量被删除了
  • 没有使用var就是一个全局变量。 如:
   function square(num){
      
        global = num * num; //global是一个全局变量
        return global;
    }
    var local = 50; //local是一个局部变量
    var number = square(20); //number是一个局部变量
    alert(global); //结果:400

3.执行环境(execution context)

每个执行环境都有一个与之关联的变量对象,环境中定义的所有的变量和函数都保存在这个变量对象中。

4. 作用域链(scope chain)

JavaScript中每个函数都有一个执行环境,当代码在一个环境中执行时,就会创建变量对象的作用域链。
  • 作用域链用途:保证对执行环境有权访问的变量和函数的有序访问。

  • 如果这个环境是函数,则将其活动对象作为变量对象。

  • 作用域链的前端,始终都是当期那执行环境的代码所在的变量对象。作用域链中的下一个变量对象来自包含(外部)环境,而在再下一个变量对象则是来自下一个包含环境,这样一直延续到全局执行环境。

  • 全局执行环境的变量对象始终都是作用域链中的最后一个对象。

5. 作用域链组成

在JavaScript的最顶层代码,也就是不包含在任何函数定义内的代码,作用域链由一个全局对象组成。

  • 在不包含嵌套的函数体内,作用域链上有两个对象:(1)定义函数参数和局部变量对象。 (2)全局对象。

  • 在一个嵌套的函数体内,作用域链上至少有三个对象。

6. 理解作用域链

当定义一个函数时,它实际上保存一个作用域链,当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加到保存它的作用域链上。

7. 作用域链访问

内部环境可以通过作用域链访问所在的外部环境,但是外部环境不能访问内部环境的任何变量和函数。

例如:

    var color1 = "blue";
    function changeColor(){
     
        var color2 = "red";
        function swapColor(){
      
        var temp = color2;
        color2 = color1;
        color1 = temp;
        //这里可以访问color1,color2,temp 
        //(即swapColor这个函数作用域内)
    }
    //这里可以访问color1,color2,但是不能访问temp 
    //(即在changeColor这个大函数的作用域内)
    swapColor();
    }
    //这里只能访问color1 (即全局作用域)
    changeColor();

你可能感兴趣的:(JavaScript,javascript,全局变量,局部变量)