欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-08 20:46:24
1. javascript的变量分为两种: 全局变量(global variable):可以在脚本的任何位置被引用。 局部变量(local variable):只存在于声明它的那...

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):每个执行环境都有一个与之关联的变量对象,环境中定义的所有的变量和函数都保存在这个变量对象中。

全局执行环境是最外围的一个执行环境,在web中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。

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();