闭包是一个函数和其作用域对象组成的结果,使用闭包能够访问函数作用域中的变量。从代码形式上看闭包是一个做为返回值的函数,如下代码所示:
<script>
function foo() {
let i = 0;
// 函数内部分函数
function bar() {
console.log(++i);
}
// 将函数做为返回值
return bar;
}
// fn 即为闭包函数
let fn = foo();
fn(); // 1
</script>
面试题:
function fn1() {
let i = 1
function fn2() {
console.log(i)
i++
}
return fn2
}
let fanhuizhi = fn1()
fanhuizhi() // 1
fanhuizhi() // 2
fanhuizhi() // 3
总结:
闭包:一个作用域有权访问另外一个作用域的局部变量。
好处:可以把一个变量使用范围延伸
- 闭包本质仍是函数,只不是从函数内部返回的
- 闭包能够创建外部可访问的隔离作用域,避免全局变量污染
- 过度使用闭包可能造成内存泄漏(内存占用过多)
现在闭包用的非常少了。因为有块级作用域。
注:回调函数也能访问函数内部的局部变量。