javascript - 一个没有理解面试题
PHP中文网
PHP中文网 2017-04-10 15:20:37
0
19
698
 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中文网

认证0级讲师

reply all(19)
大家讲道理

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

Peter_Zhu

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

javascriptvar tt = 'aa';

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

       alert(tt); // 此时tt为undefined
       tt = 'dd'; // 赋值为'dd'
       alert(tt); // 因此此时输出'dd'
}

test();
巴扎黑

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

黄舟

作用域内声明提升了

洪涛

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

大家讲道理

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

刘奇

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

刘奇

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

迷茫

求告知公司名

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template