闭包

一.闭包定义(可以产生并存储私有变量,并且被长期保留)
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)
           
        }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值