作用域
什么是作用域?
每个代码块都会形成一个作用域,变量,对象,函数都只能在当前作用域和所有的下级作用域被使用
什么是自由变量?
在当前作用域没有被声明,但是却被使用了的变量。
js遇到自由变量就会往上级作用域一层一层找,直到找到为止,如果找不到就会报错xx is not defined
闭包
有两种情况:
1.函数作为返回值返回**
//函数作为返回值
function out(){
let a = 1
function in(){
return ++a
}
return in
}
const fn = out()
let a = 2
console.log(fn()) //1
当out函数在函数外被调用并且返回的函数in被引用
由于执行函数out所创建的局部变量a通过引用in函数的变量可以被访问到(可达),所以不会被销毁,此时这个被引用的in函数实例就是一个闭包,为什么被称为闭包,因为他打破了作用域规则
2.函数作为参数被传递
//函数作为参数
function print(fnIn){
let a = 2
console.log(fnIn())
}
let a = 1
function fnOut(){
return a
}
print(fnOut) //1
闭包的应用场景
场景一:防抖和节流
//防抖
function debounce(fn,delay){
let timeout
return function(){
if(timeout){
clearTimeout(timeout)
}
timeout = setTimeout(() => {
fn(...arguments)
},delay)
}
}
//节流
function throttle(fn,delay){
let flag = true
return function(){
if(flag){
flag = false
setTimeout(() => {
fn(...arguments)
flag = true
},delay)
}
}
}