要了解闭包,需要先了解下JS变量的作用域
变量的作用域无非就是两种:全局变量和局部变量
特点是 函数内部可以访问外部变量,函数外部不能访问函数内的变量
那么如何从外部读取局部变量?
那就是在函数的内部,再定义一个子函数,这个子函数可以访问外部的变量,然后父函数把这个子函数
return,让外部可以通过子函数访问自己的局部变量
function f1(){
var n = 9;
function f2(){
console.log(n)
}
return f2;
}
var result = f1();
result();
这就是实现闭包的方法
所谓“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目 标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新 的值,和上次那次调用的是各自独立的
闭包在子作用域中保存了一份在父级作用域取得的变量,这些变量不会随父级作用域的销毁而销毁,因为他们已经常驻内存了
特性:
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制
缺点:闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗。