一.闭包定义(可以产生并存储私有变量,并且被长期保留)
1.函数执行后返回一个内部嵌套的函数或者返回含有函数的对象,
2.外函数并且存储在外部变量中,
3.该内函数有权访问外函数局部变量(私有变量)即通过内函数访问外函数的局部变量(私有变量)
如:
function fn1(){
var a=1;
//因为在内部函数中调用了该局部变量a,因此a不会被销毁
//因为a不会被销毁,导致内存泄漏
return function(){
a++;//该返回函数有权访问外部函数局部变量
console.log(a)
}
}
var fn=fn1();//返回值存储在外部变量中
fn();//2 a不会被销毁
fn();//3 a不会被销毁
fn()=null; //a会被销毁
二私有变量 局部变量 共有变量 全局变量
1.私有变量外部不可以访问,也无法进行修改,只有在内部计算时可以使用,并且被长期保留
2.局部变量外部不可访问也无法修改只能在函数内使用,函数运行完成后被销毁
3.共有变量是针对某个类或者对象的属性,允许外部访问修改并且被长期保留如类中的属性
4.全局变量在任何地方都可以获取到的变量,并且被长期保存的变量
减少全局变量的使用
4.1.命名空间 需要考虑变量的重名问题(变量污染)
4.2.减少栈中的数据存储
4.3.可以让我们函数更少的直接调用全局变量,而考虑函数抽象性
5.减少全局变量的使用就要考虑使用局部变量,但是局部变量不能长时间存储,使用闭包产生私有变量来处理
6.闭包就是能够访问自由变量的函数
7.如果闭包使用不当,容易造成内存泄漏 闭包函数运行结束后,产生的数据仍会保存在内存中
8.使用闭包常见的方式有传入一个函数参数,或者返回一个函数
function fn8(fn){
var s=10;
return fn()+s;
}
function fn9(){
return 5;
}
var n=fn8(fn9);
三举例及定时器事件函数中的闭包
1. //事件函数闭包/
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
var bns=document.querySelectorAll("button");
for(var i=0;i<bns.length;i++){
(function(i){
// i变成局部变量
// i变成私有变量//在函数外部加上一个自执行函数,将i当作变量传入
bns[i].οnclick=function(e){
console.log(i);//0,1,2,3,4,5
}
})(i);
}
var bns=document.querySelectorAll("button");
for(var i=0;i<bns.length;i++){
// i变成全局变量
bns[i].οnclick=function(e){
console.log(i);//6个6
}
}
2./计数器闭包/
for (var i = 0; i < 10; i++) {
setTimeout((function(i){
return function () {
console.log(i);//0~9
}
})(i), 0)
}
for (var i = 0; i < 10; i++) {
(function(i){
setTimeout(function(){
console.log(i);//0~9
},0)
})(i)
}
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);//10个10
},0)
}