闭包
什么是闭包?
函数嵌套函数,被嵌套的函数就是闭包函数
闭包是指在函数外部访问函数作用域中变量(局部变量)的函数
作用:
- 在一个函数的外部,可以使用函数内存的局部变量 ,
- 可以让读取的变量始终保存在内存中(增加块级作用域)
- 正常函数执行完毕之后,里面声明的变量被垃圾回收机制处理掉,但是闭包可以让作用域中的变量,在函数执行完毕之后依旧保持没有被垃圾回收机制处理掉(垃圾回收,当new一个对象的时候,相当于开辟一个空间,当这个空间不用的时候,垃圾回收机制会对这个空间进行清空,以便重新使用)
在不使用let
的情况下,我们想要每调用一次fun
函数,使得count++
(count
必须定义在函数体内),则我们就需要使用闭包函数
function fun(){
var count=0;
return function(){
console.log(count++);
}
}
var f=fun();//将局部变量的生命周期和全局变量f的生命周期进行绑定
f();
f();
f();
使用自运行的方式书写闭包函数
let f=(function(){
var count=0;
return function(){
return count++;
}
})()
console.log(f())
console.log(f())
console.log(f())
块级作用域
java,C,C++都有块作用域,即一对花括号里定义的变量,只在该花括号里起作用。
当我们需要给a增加一个块级作用域,让它在外部不被访问到,则需要使用闭包
{
var a=10;
}
console.log(a);//10
function fun(){
let f= function(){
var a=30;
}
console.log(a);
}
fun()
闭包的方式实现 乘法运算
function mult(m) {
return function(n) {
return function(k) {
return m * n * k;
}
}
}
console.log(mult(1)(2)(3));
使用闭包注意事项
- 闭包会是得函数中变量都被保存在内存中,会导致内存消耗很大,因此不能滥用闭包,否则会导致网页的性能问题,在IE中可能会导致内存泄漏
- 闭包会在父函数外部改变父函数内部变量的值,因此不要随意的改变父函数内部变量的值(如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性, 注意不要随便改变父函数内部变量的值,如果闭包内部的变量被改变了,当我们调用方法时,就会导致内部数据改变)