Fork me on GitHub

JS-闭包

闭包

闭包是什么

外层函数包裹受保护的变量和内层函数量,外层函数将内层函数返回到外部。
优点: 重用变量,保护变量被污染
缺点:占用内层。滥用会造成内存泄漏
如何释放闭包:将引用内存函数对象的外部变量设置为 null
外层函数将内层函数返回到外部的方法:

  • return
  • 赋值给全局变量
  • 将内层函数包裹在对象或数组内返回

应用场景:

  • 函数作为参数传递(作用域的例子)
  • 函数作为返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
function outer() {
var num = 0;
return function inner() {
num++;
console.log(num)
}
}
var func1 = outer()
func1() //1
func1() //2
var func2 = outer()
func2() //1
func2() //2

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var fn = null;
function foo() {
var a = 2;
function innerFoo() {
console.log(a);
}
fn = innerFoo; // 将 innnerFoo的引用,赋值给全局变量中的fn
}

function bar() {
fn(); // 此处的保留的innerFoo的引用
}

foo();
bar(); // 2

闭包

总结

  • 闭包是在函数被调用执行的时候才被确认创建的。
  • 闭包的形成,与作用域链的访问顺序有直接关系。
  • 只有内部函数访问了上层作用域中的变量对象,才会形成闭包。

应用场景

  • 柯里化
  • 模块化
-------------本文结束感谢阅读-------------