js中的闭包

闭包(英文:closure)

1. 闭包是一个函数与作用域环境(即 词法环境)形成的闭包**

2. 闭包的理解:

广义的闭包:1.函数 2.这个函数能访问到函数外部的状态(也称函数外部的变量)
并不是我们平时理解的闭包:函数嵌套函数,并且内部函数通过return返回到外部,外部可以访问内部函数的变量

总结:闭包=函数+自由变量

自由变量:即可以是外部的变量,也可是父级函数的形参

闭包特点

闭包中自由变量长期驻留内存,长期驻留内存中的变量如果处理不当,会导致内存泄露,不用的话要将闭包置为null
可以隔离作用域,模拟块级作用域

自由变量:就是在函数外部定义的,并且在函数内部可以访问到的变量就叫自由变量

3.具体讲一下闭包的实际应用举例

作用域链:通过在当前函数内部查找要访问的变量,如果有则访问,没有则向上一级查找此变量,上级有则访问之,没有再再往上上一级查找,以此类推,直到找到全部window下有没有,有则访问,没有些报错

是否有点像原型链的查找呢????非常像

实用案例:

1.计数器

//功能:递增,递减,获取递增或递减之后的值

var Counter=function() {
    //私有变量
    var num=0;
    //私有函数
    var changeValue=function(n) {

        return num+=n;

    }


   return {
       //增
       increment:function() {
            changeValue(1)
       },
       //减
       decrement:function() {
            changeValue(-1)
       },
       //获取值
       getValue:function() {
           return num;
       }
   }
}

2.改变页面字号

function setSize(size) {

   return function() {

     document.body.style.fontSize=size+'px'

   }

}

var size12=setSize(12);

var size40=setSize(40)

var size50=setSize(50);

3.定时器累加

//要求每隔1秒打印1,2,3,…10

//setTimeout是异步执行的,异步队列

for(var i=1;i<=10;i++) {
     
     (function(j) {
        setTimeout(function() {
            console.log('i=j的值:',j)
        },2000*j)
     })(i)

  }

  console.log('最后打印:',i)

   for(let i=1;i<=10;i++) {
    
        setTimeout(function() {
            console.log('i的值:',i)
        },1000*i)
   

  }

4.封装组件:

立即调用函数

(function(win,doc) {

  //尽情写你的代码啦!
  //私有变量
  
  //私有方法
  
  
  return {
  
  	暴露出去的方法
  
  }




})(window,document)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值