検索

ホームページ  >  に質問  >  本文

javascript - 一个没有理解面试题

 var tt = 'aa';   

 function test(){

       alert(tt);
       var tt = 'dd';
       alert(tt);    

       }   

  test();

为什么第一个弹出undifine呢?

又:

 var tt = 'aa';

 function test(){


  alert(tt);

  //var tt = 'dd';
  //alert(tt);

        }

   test();

弹出aa?

求各位大神解答下

PHP中文网PHP中文网2895日前684

全員に返信(19)返信します

  • 大家讲道理

    大家讲道理2017-04-10 15:22:37

    主要是js中的hoisting机制,第二次tt变量声明提升了,根据js的作用域链,它会在函数的作用域中找到tt的声明,而不是全局变量tt,hoisting机制具体参见这篇文章http://segmentfault.com/blog/liangyi/1190000002582759

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:22:37

    第一块的代码经过编译器的预编译后会变成这个样子:

    javascriptvar tt = 'aa';
    
    function test(){
           /*
            * 所有变量定义都会提到最上面,其实赋值语句是分为两步的,
            * 第一步定义变量:var tt,第二部赋值:tt = xxx;预编译
            * 之只会把定义变量的语句移动到最上面,而复制语句还是在原
            * 来的位置执行
            */
           var tt;
    
           alert(tt); // 此时tt为undefined
           tt = 'dd'; // 赋值为'dd'
           alert(tt); // 因此此时输出'dd'
    }
    
    test();
    

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:22:37

    根据js中函数作用域的特性,局部变量在整个函数作用域内都是有定义的,也就是说,这个时候局部变量会遮盖全局的同名变量,因此在函数体内alert的是局部变量tt。此时涉及到js的另外一个特性就是变量声明提前,即先var tt;然后再alert(tt),此时tt还没有被赋值,因此是undefined。

    返事
    0
  • 黄舟

    黄舟2017-04-10 15:22:37

    作用域内声明提升了

    返事
    0
  • PHP中文网

    PHP中文网2017-04-10 15:22:37

    其实我觉得LZ对于局部 全局应当是了解的(这都不懂还去面试?)
    只不过没有想到声明提升而已

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:22:37

    楼主作用域链没有搞明白,先去看书吧

    返事
    0
  • 怪我咯

    怪我咯2017-04-10 15:22:37

    大家都已经回答的很好了,这是各类js书上作用域章节中都会出现的例子,哈哈。

    返事
    0
  • 怪我咯

    怪我咯2017-04-10 15:22:37

    那个公司面试的,那么简单~~~

    返事
    0
  • 迷茫

    迷茫2017-04-10 15:22:37

    求告知公司名

    返事
    0
  • キャンセル返事