- 闭包:内层函数+外层函数的变量,能够访问记住其外部函数作用域中的变量,即使外部函数已经执行完毕,这是因为闭包函数捕获了外部函数的执行环境
- 弊端:可能导致内存泄漏
- 应用于:
1.数据私有化和封装:闭包可以用来创建私有变量
2.函数工厂:闭包可以用来生成定制的函数,比如记忆函数,柯里化函数
3.回调函数:闭包可以用来在回调函数中访问外部函数的变量
4.循环中的回调函数:在循环中使用闭包可以解决变量作用域的问题
1.简单写法
function outer() {
let a = 10;
function fn() {
console.log(a);
//输出结果:10
}
fn()
}
outer()
2.常见的闭包形式,外部函数可以访问使用函数内部的变量
function outers() {
let a = 10;
function fn() {
console.log(a);
//输出结果:10
}
return fn
}
// outers()===fn===function fn(){}
const fun = outers()
// const fun=function fn(){}
fun()//调用函数,外面要使用a=10
3.数据私有化和封装
function createCounter() {
let count = 0;
//定义了一个函数createCounter()返回了一个对象,对象里有三种方法,每个方法都能操作外部的count
return {
increment: function () {
count++
},
decrement: function () {
count--
},
getCount: function () {
return count
}
}
}
const myCounter = createCounter();
myCounter.increment();
myCounter.increment();
//调用 myCounter 对象上的 increment 方法两次,使 count 变量的值增加 2
console.log(myCounter.getCount())
//输出结果:2
4.在循环中回调函数
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
//输出结果:0 1 2 3 4
}, i * 1000)
}
//setTimeout()回调函数是通过闭包访问的,每次循环都会创建一个新的块级作用域,所以每个回调函数都能访问到正确的i值
标签:闭包,function,函数,myCounter,JavaScript,count,fn
From: https://blog.csdn.net/m0_69666992/article/details/139694087