为什么面试总问闭包?

88 阅读1分钟

前言

相信大家面试的时候都有被问到闭包,但是很多时候利用框架后,并没有太多的使用闭包,那为什么面试频频问到呢?

闭包是什么

闭包的产生其实是跟作用域链有关,ES5的全局作用域和函数作用域 因为在查找一个使用的变量时,首先会在当前作用域找,没有找到就会向父级作用域寻找,这就是作用域链 先看代码

function parent() {
  var a = 1;
  console.log(a, 'parent')
  return function child() {
    a++
    console.log(a, 'child')
  };
}
var add = parent();
add();//2,child
add();//3,child
parent();//1,parent

通过作用域链找到a,在add执行后parent函数里的a没有改变,add里的a相当于是它自己的私有变量 由此我们可以得出 闭包的本质是当前环境存在指向父级作用域的引用 并且互不干扰

产生闭包的方式

1、返回一个函数

function back(){
    var b = 1;
    return function child(){
    console.log(b)
}

2、作为函数参数传递

for(var i=0;i<5;i++){
    (function (j){
        setTimeout(()=>{
           console.log(j)
        },1000)
     })(i)
}

经典面试题

for(var i=0;i<5;i++){
  setTimeout(()=>{
    console.log(i)
  },1000)
}

实际应用

 //防抖多次快速点击,
function antiShake() {
  var shakeTime = null;
  return function () {
    clearTimeout(shakeTime);
    shakeTime = setTimeout(() => {
    }, 1000)
  }
}


//节流:在规定时间内都会执行一次
function throttle() {
  var flag = true;
  return function () {
    if (flag) {
      setTimeout(function () {
        flag = true;
      }, 1000)
    }
    flag = false;
  }
}