js闭包
一.js闭包的条件:
1. 在函数 A 内部直接或者间接返回一个函数 B,
2.B 函数内部使用着 A 函数的私有变量(私有数据),
3. A 函数外部有一个变量接受着函数 B
我们管这个不会销毁的 a 函数的执行空间叫做 闭包空间。
function a() {
// 这个 num 变量就是函数 a 的私有变量
var num = 100
return function b() {
console.log(num)
}
}
// pon接受的是 a 函数执行以后的返回值
// pon接受的就是函数 a 内部返回的一个复杂数据类型(函数b)
// 导致函数 a 的执行空间不会销毁
var pon= a()
// 从现在开始, pon随时可以是一个 函数a 里面返回的 函数b
// pon随时可以调用
pon()
二.js闭包的特点(优点和缺点并存)
function f1() {
var num = 10
return function f2() {
console.log(num++)
}
}
var res = f1()
1.延长变量的声明周期
优点: 变量会一直存在
缺点: 一个不会销毁的函数执行空间
列如再上一个函数f1()
+ 在执行的时候, 会生成一个函数执行空间
+ 在这个函数执行空间里面有一个 num 变量
+ 等到代码执行完毕, 这个执行空间就销毁了
+ 那么函数里面的私有变量 num 也不存在了
-
可以在函数外部访问内部数据
优点: 函数外部访问内部数据
缺点: 需要一个不会销毁的函数执行空间//列如在全局变量访问函数f1()这个函数 console.log(num) + 报错, 没有这个变量 + 因为 num 是函数f1的私有变量,在函数数内部可以访问 + 在函数外部不能访问函数内部的私有变量
-
保护私有变量
优点: 内部的变量不能再外部访问
缺点: 闭包空间可以访问内部数据
闭包的函数的缺点 致命
+因为当一段内存空间中有一个不会被销毁的东西一直存在
+那么就会出现内存占用, 如果过多, 就会导致内存溢出
+那么结果就是 内存泄漏
三.闭包的用途:
1、可以读取函数内部的变量 ,保护函数内的变量安全。
以上面一个列子为列函数f1中i只有函数f2才能访问,而无法通过其他途径访
问到,因此保护了num的安全性。
2.让这些变量的值始终保持在内存中。
依然如上面的那个,由于闭包,函数f1中i的一直存在于内存中,因此每次执
行res(),都会给num自动加1。
四,使用闭包时要注意
1.闭包会使得函数中的变量都被保存在内存中
由于闭包会使得函数中的变量都被保存在内存中,就会占用内存使的内存消
耗较大,所以在写代码时的时候能不使用闭包就不要去使用闭包,否则会造成
网页的性能问题,使得网页产生的卡顿,在IE中可能导致内存泄露。
解决的办法
解决的办法就是在退出函数之前把不需要使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值
所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法
(Public Method),把内部变量当作它的私有属性(private value),这时
一定要小心,不要随便改变父函数内部变量的值。