闭包 是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日 形成初版
参考文献: