关于JS闭包

1.什么是闭包?
闭包是变量的一种。
2.闭包的特点
闭包形成私有的作用域 ,保护私有变量的机制,
让私有变量存到内存里面

        var add = (function (){
       var count = 0;//局部变量转私有变量,让其内部的返回函数可以访问私有变量
       return function(){
           count++;
           console.log(count);
       }
   })();
   //add 变量指向的 自执行函数
   //返回的结果是一个匿名函数
   add();
   add();
   add();

3.弊端
不建议大量使用闭包,闭包的变量存到内存里面,会导致内存泄漏

关于闭包的练习题

var med = "link";
    var fun = function(){
        console.log(med);
        var med = "snk";
        return function(){
            console.log(med);
        }
    }
    fun()(); */

答案:“snk”

//经典
    //函数形参没传值 形参值underfined
    function fun(n,o){
        console.log(o);
        var md = n;
        return {
            fun:function(m){
                return fun(m,md);
            }
        }
    }
    //该函数返回的是一个对象 在同一个对象上点的时候值不发生变化
     var a = fun(0); a.fun(1); a.fun(2);a.fun(3);
    var b = fun(0).fun(1).fun(2).fun(3);//funderfined 0 1 2
    //闭包面试题 里面存在闭包 也存在对象之间的调用 对象点 还是对象点连点
    var c = fun(0).fun(1);fun(2).fun(3);//underfined 0 1 1

问a,b,c的值什么?
答案:a:0 0 0 0
b:unfined 0 1 2
c:unfined 0 1 1

var res = [];//数组
    for(var i = 0;i<10;i++){
        var add = function(n){
            var c = n;
            return function(){
                console.log(c);
            }
        }
        res [i] = add(i);//当前函数运行返回的是一个匿名函数
    }
    res[0]();
    res[1]();
    res[2]();

计时器闭包问题

    //计时器闭包
    for(var i = 0;i<10;i++){
        setTimeout(function(){
            console.log(i);//10 10 10
        },0)//这个计时器的延迟是0ms 去执行内部的匿名函数
    }
    //计时器要占用队列

问:输出值为多少?
答:10 10 10,因为js为单线程,要执行队列,所以每次输出都为最大值。

修改为闭包
for(var i = 0;i<10;i++){
        (function(){
            setTimeout(function(n){
                console.log(n);
            },0)
        })(i);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值