彻底搞懂闭包

闭包 是JS中一个很重要的概念,使用闭包可以让JS发挥更强大的能力,比如 柯里化,从而应用更多的场景。

闭包概念

闭包(Closure):一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围)

闭包可以在另一个作用域中调用一个函数内部函数并并访问该函数作用域中的成员。

function clouseFn() {
    let msg = "hell world!"
    return function() {
        console.log(msg);
    }
}

let clouseInerFn = clouseFn()
clouseInerFn()

闭包的本质:正常情况下,函数执行时会被放在一个执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问其父作用域的成员。

在上述代码中,clouseInerFn引用clouseFn的内部匿名函数,在调用clouseInerFn函数时,可以访问clouseFn内部的成员变量msg。

闭包发生的时机

调用函数内部函数时,会发生闭包

将上述代码放到 html文件中,我们简单调试一下:
闭包调试
如上图所示,当执行 clouseInerFn函数时,就会发生闭包,如有图 Closure.

闭包的应用

函数柯里化

函数柯里化是优化代码的一种极好的方式

如下代码

let fivePow =  Math.pow(5, 2)
let sixPow = Math.pow(5, 3)

console.log(fivePow, sixPow)

// 柯里化 
function powOf(pow) {
    return function(num) {
        return Math.pow(num, pow)
    }
}

let powOf2 = powOf(2)
let powOf3 = powOf(3)

console.log(powOf2(5),powOf3(5))

在上述代码中,我们如果想求某个数的平方或立方,我只需要调用powOf2 和powOf3 函数,传递相应的参数即可。

文档版本:

  • 2021年8月22日 形成初版

参考文献:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值