之前看到论坛上有道网易的笔试题,让判断输出什么,代码如下:
  var tt = 'aa';  
  function test(){  
  alert(tt);  
  var tt = 'dd';  
  alert(tt);  
  }  
  test();
答案是:undefined , dd但是如果我把代码变成如下,
  var tt = 'aa';  
  function test(){  
  alert(tt);  
  //var tt = 'dd';  
  //alert(tt);  
  }  
  test();
却得到的是:aa为什么这个的得到的不是和第一段代码一样的undefined?求高手解释

解决方案 »

  1.   

    JS 会对同一个作用域里的变量和函数预编译。var tt = 'aa';  
      function test(){  
      alert(tt);  
      var tt = 'dd';  
      alert(tt);  
      }  
      test();
    所以这个代码的时候,在执行函数体的时候,会先识别对该作用域里的变量TT,所以当执行第一个alert(tt)的时候,它会是认为这个tt是局部变量,也就是函数体内的变量,也就是它的作用域是函数体内。 那对一个只定义不赋值的变量,它的结果是undefine。而第二个自然是dd了。
      var tt = 'aa';  
      function test(){  
      alert(tt);  
      //var tt = 'dd';  
      //alert(tt);  
      }  
      test();
    这个代码的花因为没在函数体内定义变量,所以自然会认为tt是全局变量也就是属于window作用域,所以就是aa了。不知道你懂没
      

  2.   

    第一个:test函数内部的“var tt='dd'”将会致使“var tt='aa'”在test函数被调用时完全被隐藏。而且,tt是在第一个alert语句之后定义,所以在调用到第一个alert时,tt是还没有被赋值的。这样说可能会清楚一点,即,在定义test函数时,当定义第一个alert(tt)时,这里会记录tt是作用域链中的一个变量但不会记录它(tt)的值,函数定义完毕后tt就添加到作用域里,所以第一个alert语句能够找到该作用域里的tt(即,相当于找到一个已经在函数内部声明,但未被赋值的 tt)。
      

  3.   

    http://blog.csdn.net/hch126163/article/details/6022557
      

  4.   

    大体意思就是:
      由于你的程序未曾在function里面定义tt变量,所以默认tt局部变量为外围的全局变量.
      而网易的题里面,function内部同时给予了tt的定义,所以alert("tt")不会使用全局变量,而是使用内部 的局部变量,第一个前未定义,所以为undefined....