前言
相信大家面试的时候都有被问到闭包,但是很多时候利用框架后,并没有太多的使用闭包,那为什么面试频频问到呢?
闭包是什么
闭包的产生其实是跟作用域链有关,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;
}
}