<html>
 <head>
  <title>variable scope</title>
 </head> <body>
  <script type="text/javascript">

var fristName = "abc";
lastName="def";

function ChangeName() {
document.write("Your old fristname is " + fristName + "<br>");
     document.write("My old lastname is " + lastName + "<br>"); var fristName = "xyz";
lastName="opq";
}
ChangeName(); document.write("name :" + fristName, lastName );  </script>
 </body>
</html>
为什么在函数中old fristName 会是undefined呢?

解决方案 »

  1.   

    在函数中等于    function ChangeName() {
            var fristName;
            document.write("Your old fristname is " + fristName + "<br>");
            document.write("My old lastname is " + lastName + "<br>");        fristName = "xyz";
            lastName="opq";
        }
      

  2.   

    内部的var fristName = "xyz";覆盖了外部的定义,所以是undefined呢
    换一下顺序,试试
    function ChangeName() {
     var fristName = "xyz";
            document.write("Your old fristname is " + fristName + "<br>");
            document.write("My old lastname is " + lastName + "<br>");       
            lastName="opq";
        }
      

  3.   

    你的代码相当于
    <html>
     <head>
      <title>variable scope</title>
     </head> <body>
      <script type="text/javascript">
        
        var fristName = "abc";
        lastName="def";
        
        function ChangeName() {
    var fristName = window.undefined;//声明提前,并且赋初值
            document.write("Your old fristname is " + fristName + "<br>");
            document.write("My old lastname is " + lastName + "<br>");        fristName = "xyz";
            lastName="opq";
        }
        ChangeName();    document.write("name :" + fristName, lastName );  </script>
     </body>
    </html>
    但是如果函数ChangeName中无var fristName = "xyz";则使用fristName = "abc";
      

  4.   

    关键的关键还是在于js的预加载问题。var fristName = "abc";
        lastName="def";
        
        function ChangeName() {
            document.write("Your old fristname is " + fristName + "<br>");
            document.write("My old lastname is " + lastName + "<br>");        var fristName = "xyz";//预加载导致这个变量覆盖了外部变量,浏览器解释的时候认为changeName函数中有一个局部变量firstName。所以函数体内用到firstName时都是用的局部变量
            lastName="opq";
        }
        ChangeName();    document.write("name :" + fristName, lastName );
      

  5.   

    4楼的正确,js预加载会实现1楼和3楼代码的效果
    预加载ChangeName这个函数时,会把后面声明的变量声明出来,不过不会赋值
      

  6.   

    是不是在浏览器预加载的时候有一个局部变量,只声明,没有加载,所以出现undefined呢?
      

  7.   

    JS虽然是逐行执行,但也不完全是这样。
    LZ可以理解为, 先分析了function 和 var ,然后再逐行执行
      

  8.   

    可以这么理解,预加载了但是在使用前没定义,所以就是undefined
      

  9.   

    另外LZ需要把两个地方的firstName区分开,它们不是一样的