闭包,正常理解是,函数内部的函数,用来访问局部变量,不让这个变量污染外部环境的。
但很多人,没有真正理解闭包的实际特点,今天我仔细研究了下闭包。
先看下这段代码
function debounce(fn,delay){
let timer = null //借助闭包
var x = 1
console.log(timer,'外层');
return function() {
if(timer){
clearTimeout(timer)
}
timer = setTimeout(fn,delay) // 简化写法
console.log(timer,'内层');
}
}
我们用闭包简单实现了一个防抖函数,我们在return function函数外层和内层做了输出,看是否调用debounce()都能触发。
做了一个按钮
<button>点击</button>
function show () {
console.log('点击第' + ++n,'次');
}
设置了个点击事件
var btn = document.querySelector('button')
btn.onclick = debounce(show,1000)
我们打开网页后,控制台就执行了变量的定义,和console.log
在我们点击一次按钮后,先后隔一秒输出了内层和防抖的目标函数
再点击一次,并没有输出外层,而是只执行内层
综上,闭包我认为就是主要用来定义局部变量,并且,这个变量不会被重复定义,只会在声明,要被使用时才会执行,只用函数内部return的函数会被重复使用。
其实整个js也是一个闭包,我们所声明的也只能执行一次,而函数可以重复调用。
over。