1.简介
首先要了解js 内部作用域是可以获取外部作用域的变量,反之就不行。
闭包就是用来实现外部作用域引用内部作用域的变量;
2.实现
而闭包则通过js的特性:将一个函数作为一个返回值 来实现闭包,返回的函数中引用了内部作用域的变量,从而将这个内部作用域的变量暴露在外部作用域。
function demo() {
let a = 1;
return function() {
return a;
}
}
var func = demo();// func = function() { return a; }
var b = func()//1 b = a = 1
还有一种直接函数赋值来实现闭包
var fn2;
function fn(){
var name="hello";
//将函数赋值给fn2
fn2 = function() {
return name;
}
}
fn()//要先执行进行赋值,
fn2()//执行输出: hello
3.闭包的使用场景
4.闭包的优缺点
4.1 优点
- 变量长期驻扎在内存中;
- 避免全局变量的污染;
- 私有成员的存在 ;
4.2 缺点
被引用的内部作用域的变量不会释放掉,使用不当很容易造成内存泄露。引用变量用完后设置null。