一道非常经典的面试题,不看后悔

发布者: xiaozhimn

   console.log(a);//undefined
   var a = 3;
   for(var i = 0; i < 1; i++) {
      a = 1;
      function a() {

      }
      a = 4;
      console.log(a);//输出4 
   }  
   console.log(a);//输出1
代码解释:
第一个console输入undefined很容易理解,因为在使用a的时候存在变量提升,以上代码等价于
var a;
console.log(a); //undefined
a = 3;

第二个console输出结果为4,也是很容易理解,因为javascript是解释性语言逐行执行,所以打印出来必然为4.
第三个console输出结果为1,这个是很多人费解的,主要原因在于 function a() {}这里。
     大家都知道函数也存在提升,他会被提升到当前块级作用域的最顶端,从以上可以看出函数是存储在堆
     中的并且定义在全局中上下文中,所以以上部分代码等价于:
     window.a = function() {}  
     window.a = 1;
     var a;
     a = 4; 

关于以上代码为什么这么解释,可以通过对源码进行debugger调试从堆栈中就可以看出,大家可以尝试下!

0赞

xiaozhimn

    {
      window.a = function() {}  
      window.a = 1;
      var a;
      a = 4; //block变量,块级变量,解释器认为是局部变量 
    } 
    console.log(window.a);//global变量,解释器认为是全局变量 结果为1

时间:4/28/2020, 10:33:53 AM

回复

Saber

为什么哪里是块级变量?

时间:4/28/2020, 1:07:30 PM

回复

xiaozhimn

因为这是js规定的在块中才会有变量提升和函数提升,你可以在开始写一个 debugger; 调试下就知道了

时间:4/28/2020, 2:19:06 PM