新浪博客

JS基础知识整理-------闭包

2023-05-23 15:18阅读:
说到闭包,首先要知道什么是闭包? 闭包就是能访问到外部函数作用域中的变量函数
为什么要有闭包?
1、避免变量被污染
2、私有化
3、保存变量,常驻内存
什么时候使用闭包?
当我们需要隐藏一些不希望被别人访问的内容时,就要使用闭包
下面说说,构成闭包的条件
1、函数的嵌套
2、内部函数要引用外部函数中的变量
3、内部函数要作为返回值返回
下面就是一个简单的闭包
function fn() {
let num = 0 // 位于函数作用域,只能在函数内部访问
// 匿名函数
return () => {
num ++
console.log(num)
}
}
const newfn = fn()
console.log(newfn)
newfn() // 1
newfn() // 2
闭包的原理:
函数在作用域,在函数创建时就已经确定的(词法作用域)和调用的位置无关
闭包利用的就是词法作用域
let a = '全局变量a'
// 函数在作用域,在函数创建时就已经确定的(词法作用域)和调用的位置无关
// 闭包利用的就是词法作用域
function
fn() {
console.log(a)
}
function fn2() {
let a = 'fn2中的a'
fn()
}
fn2() // 全局变量a
function fn3() {
let a = 'fn3中的a'
function fn4(){
console.log(a) // fn3中的a
}
fn4()
}
fn3()
function fn3() {
let a = 'fn3中的a'
function fn4(){
console.log(a) // fn3中的a
}
return fn4
}
let fn4 = fn3()
闭包的注意事项:
闭包主要用来隐藏一些不希望被外部访问的内容,这就意味着闭包需要占用一定的内存空间
相较于类来说,闭包比较浪费内存空间(类可以使用原型,而闭包不行)
需要执行次数较少时,使用闭包
需要大量创建实例时,使用类
闭包的生命周期:
1、闭包在外部函数调用时产生,外部函数每次调用都会产生一个全新的闭包
2、在内部函数丢失时销毁(内部函数会被垃圾机制回收,闭包才会消失)
function outer() {
let someVariable = 'someValue'
return function() {
console.log(someVariable)
}
}
outer()
function outer2() {
let num = 0
return () => {
num ++
console.log(num)
}
}
let fn1 = outer2() // 独立的闭包
let fn2 = outer2() // 独立的闭包
fn1() // 1
fn2() // 1
fn1 = null // 闭包消失(被垃圾机制回收)
fn2 = null // 闭包消失(被垃圾机制回收)
下面再写一个简单的闭包应用
// 闭包应用
let makeCounter = function () {
let privateCounter = 0
function changeBy(val) {
privateCounter += val
}
return {
increment: function() {
changeBy(1)
},
decrement: function() {
changeBy(-1)
},
value: function() {
return privateCounter
}
}
}
let c1 = makeCounter()
c1.increment() // c1.value() === 1
c1.increment() // c1.value() === 2
console.log(c1.value())

我的更多文章

下载客户端阅读体验更佳

APP专享