【JavaScript高级程序设计】2、变量、作用域和内存问题

1、执行环境以及作用域

 

当代码在一个环境执行的时候,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域的前端,始终都是当前执行的代码所在环境的变量对象。如果是函数,那么在这个函数中开始只包含一个变量,那就是arguments对象。下一个变量则来自下一个包含环境(外部)。

 

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
 </head>

    <script type="text/javascript">

        var color = "blue";

        function changeColor()
        {
            if(color === "blue")
            {
                color = "red";
            }
            else
            {
                color = "blue";
            }
        }

        changeColor();

        alert("当前颜色是:" + color);

    </script>

 <body>
  
 </body>
</html>

 

这个函数就包含两个作用域链,第一个就是函数的参数也就是arguments,然后包含外部环境就是全局变量color,可以在函数内部访问全局变量就是因为可以在这个作用域链中找到全局变量环境

 

在局部作用域中定义的变量可以和在局部变量中的全局变量互换使用。如下代码

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
 </head>

    <script type="text/javascript">

        var color = "blue";

        function changeColor()
        {
            var anotherColor = "red";
            
            function swapColors()
            {
                var tempColor = anotherColor;
                anotherColor = color;
                color = tempColor;

                //这个地方可以访问三个作用域的变量,color, anotherColor, tempColor
            }

            //这里就不能访问tempColor了
            swapColors();
        }
    
        //这里就只能访问color
        changeColor();

        alert("当前颜色是:" + color);

    </script>

 <body>
  
 </body>
</html>

 

这里显示全局变量和局部变量的相互交换与操作。

 

 2、延长作用域链

 

 使用一些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行之后被移除。

那两个语句就是try-catch和with.

这里不多做论述。

 

3、没有块级作用域

JavaScript中的变量if和for语句中的变量将会将变量添加到当前的执行环境中

for(var i = 0; i < 10; ++i)

  dosomething(i);

 

alert(i);  //这里的i是10

 

就是for中的变量i被添加到当前环境中了。

 

在申明变量的时候如果有var修饰的话就是var会被自动添加到最近的环境中,如果没有var修饰的话那么就是变成全局变量

 

 

posted @ 2016-06-30 09:45  cutter_point  阅读(129)  评论(0)    收藏  举报