什么是闭包?
在了解闭包之前,我们要清楚js的另一个知识,那就是作用域链。什么是作用域链,比如一个函数里面包含着另一个函数,里面的函数在使用一个变量的时候会在函数自己的作用域内去查找这个变量,如果没有,就会沿着作用域链向上级函数的作用域去查找,这样的一个过程我们就叫做作用域链。
作用域链是可以有函数内部向外部去查找使用需要的变量,但是无法从上到下去查找函数内部的变量,所以这时候就出现了闭包,闭包就是解决这一问题。
- 闭包是能读取其他函数内部变量的函数。
- 闭包也可以简单定义为一个在函数内部的函数。
- 所以,闭包可以理解为函数内部与函数外部连接起来的桥梁。
闭包的特点:
1. 让外部访问函数内部变量变成可能
2.局部变量会常驻在内存中
3.可以避免使用全局变量,防止全局变量污染;
function f1(){
var n = 100
function f2(){
n=n+100
console.log(n);
}
return f2
}
var num1 = f1()
num1() // 200
创建一个fn的函数,并且在内部创建一个f2的函数,在正常情况下,在f2中可以访问f1的变量,但是f1不能访问f2中定义的变量,但是通过return将f2作为参数返回给f1,通过f2闭包建立起来与f1的联系,可以访问f1中的变量
闭包总结:
1.闭包是一个可以访问另一个函数内部变量的函数
2.一般的函数在使用完后,内部的变量会被回收,而闭包不会,变量依旧存在于内存中,不会消失。
3.频繁的使用闭包会占用内存,降低CPU性能,但是可以释放内存(在使用完闭包后,手动使变量为null)