闭包函数是一种函数的使用方式。
// 闭包函数执行
let add = (function () {
let counter = 0;
return function () {
return counter += 1;
}
})();
add(); // counter = 1
add(); // counter = 2
add(); // counter = 3
//对比正常的执行函数
let edit = (function () {
let counter = 0;
return counter += 1;
})();
edit(); // counter = 1
edit(); // counter = 1
edit(); // counter = 1
变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器counter = 0。并返回函数表达式。
add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。
计数器受匿名函数的作用域保护,只能通过 add 方法修改。
// 主动编写的闭包
let fnn = null;
function fn(){
let count = 10;
fnn = function(){
count++;
debugger
}
}
fn();
fnn(); //调用形成闭包 count = 11
fnn(); //调用形成闭包 count = 12
两次调用fnn() ,闭包函数
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
直观的说就是形成一个不销毁的栈环境。
闭包形成后,会导致父函数的内存空间暂存,即使父函数调用完也不会 被销毁滥用、多用闭包会导致,内存空间被消耗,引起应用卡顿,严重的可导致 内存溢出
闭包作用:局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。延伸变量的作用范围。
闭包特点:占用更多内存;不容易被释放
闭包用法:变量既想反复使用,又想避免全局污染如何使用?
1.定义外层函数,封装被保护的局部变量。
2.定义内层函数,执行对外部函数变量的操作。
3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。