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