??如上图所示,“当javascript代码需要查询变量x的值时(一个称为变量名解析的过程),它就开始查看该链的第一个对象。如果那个对象有一个名为x的属性,那么就采用那个属性的值。如果第一个对象没有名为x的属性,javascript就会继续查询链中的第二个对象。如果第二个对象仍然没有名为x的属性。那么就继续查询下一个对象,以此类推。”假如有这么一个:
<script>var x =3;//这个全局变量xfunction a(){var x =1;//这是函数a内的变量x
 document.write("a:"+x); //这个显示函数a内的变量值
         function b(){
             var x = 2;//这是函数b内的变量x
             document.write("b:"+x);//这个显示函数b内的变量值
 }
b();
}
a();
document.write("w:"+x); //这个显示全局变量x的值
</script>结果显示为a:1b:2w:3
但和那段话“。如果那个对象有一个名为x的属性,那么就采用那个属性的值。如果第一个对象没有名为x的属性,javascript就会继续查询链中的第二个对象。如果第二个对象仍然没有名为x的属性。那么就继续查询下一个对象,以此类推。” 好像矛盾了。因为在函数b内的var x=2;已经找到了名为x的属性,依据这个图  来看的话,很显然根据流程图可知,要是“在此定义”的话就直接获得该值, 以后的全局变量和外层函数a内所定义的x就该忽略了,但结果却依然把各个作用域的值都显示了,难道那段话就是错误的么?还是自己理解上的问题了。
关键是这个图
这个图的流程图就判断分支,一旦选择 是 的话后面的就不执行了,但在嵌套函数中的执行结果来看其他的还是执行了,好像这个图的解释是错误的??
请大家帮着看看,谢谢了

解决方案 »

  1.   

    那个图描述的已经非常清楚了啊。"要是“在此定义”的话就直接获得该值,   以后的全局变量和外层函数a内所定义的x就该忽略了"function   b(){
        var   x   =   2;
        document.write( "b: "+x);//x在此定义了,直接获取该值
    }function   a(){
        var   x   =1;
        document.write( "a: "+x);//x在此定义了,直接获取该值
        //....
    }var   x   =3;
    document.write( "w: "+x);//x在此定义了,直接获取该值
      

  2.   

    http://a.thec.cn/panwill300/bl.jpg[开始]指的是当前被调用的函数部分,已此为开始,然后一级一级往上查找!
    <script>var   x   =3;//这个全局变量xfunction   a(){var   x   =1;//这是函数a内的变量x
      document.write( "a: "+x);   //这个显示函数a内的变量值
                      function   b(){
                              var   x   =   2;//这是函数b内的变量x
                              document.write( "b: "+x);//这个显示函数b内的变量值
      }
    b();
    }
    a();
    document.write( "w: "+x);   //这个显示全局变量x的值
    </script> 它的顺序应该是:b();
    a();
    global