let经典面试题

1.var
  var arr = []; for (var i = 0;i<2;i++){
    arr[i] = function(){
      console.log(i);
    }
   }
   arr[0]();
   arr[1]();
   解析:
  
//当i<2时,循环条件才成立,i=2时,执行for循环后面的语句。
  //在循环中,是向arr数组中添加值(值就是一个函数,此时的函数并未执行),因为循环执行了两次,所以arr中有两个值(都是函数,当函数调用时,就输出i的值)
  //arr[0]()代码,实际就是在调用数组中的函数,通过数组下表,取到数组中的值(值就是函数,函数执行完输出的i是多少?)
  //在循环代码中并没有定义 i 的值,根据作用域查找原则,向上一层中进行查找(全局作用域中的i)
  //当执行arr[0]()时,for循环早已结束,所以此时的 i 值,是不满足for循环条件的值(当 i=2 时就不满足条件了),所以函数执行时输入的i值是2。
  //由于数组中存储的两个函数在输出时,都是全局变量i,所以两次输出的 i 是一致的,都是 2 
  //此题的关键点在于变量 i 是全局的,函数执行时,输出的都是全局作用域下的 i 值。
2.let
  let arr=[];
  for(let i=0;i<2;i++){
    arr[i]=function(){
      console.log(i);
    }
  }
  arr[0]();
  arr[1]();
 //此题的关键点在于每次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的 i 值
posted @ 2019-11-09 15:49  晴天宝宝i  阅读(36)  评论(0编辑  收藏  举报