详讲闭包的定义和使用!

什么是闭包?及定义和使用

想必好多前端开发者对于 闭包 都不陌生,也是面试中经常被问到的问题之一。
先看看官方对闭包的解释:一个拥有许多变量和绑定了这些变量的环境的表达式的一部分。哎呀呀~说的好像有点抽象。以下是个人结合开发经验的理解:
因为javascript语言是允许一个外部函数里可以定义一个内部函数的。
简单说闭包:也就是一个函数可以定义在另一个函数体内。并且这个内部函数是可以访问外部函数里定义的局部变量。
再简单点就是 :一个函数里套一个函数。(闭包是定义在一个函数内部的函数)
当这个内部函数在包含它外部函数之外被调用时,就形成了闭包。
下面看看闭包的写法:
先看看这种写法
看上去是对象里定义了函数,在javascript中万物皆对象,其实函数也是对象的一种。

    var obj1 = {
      hello:1,
      btn1:function(w1){
        //这里的this指向是obj1对象哈(说明下:当函数作为某个对象的方法调用时指的        是当前对象哈~后面有空会发一个this指向的博客)
        console.log("闭包1:",this.hello+w1 );
        return this.hello+1 ;
      }
    }
    obj1.btn1(1);
     //闭包1: 2

这种写法好像和上面的区别不大哈,new个对象,在给对象添加属性和方法

    var obj2  = new Object();
    obj2.hello = 1;
    obj2.btn2 = function(w2){
      console.log("闭包2:",this.hello+w2)
      return this.hello+w2
    }
    obj2.btn2(2)
    //闭包2: 3

这种就比较直观 了,就是函数里套函数啦~

   function btn3(){
     var w3 = 10
     function btn4(){
       console.log("闭包3:",w3)  //10
   }

闭包理解为一个外部函数里定义一个内部函数,并且内部函数可以拿到外部函数的局部变量,那么如果调外部函数想拿内部函数里的变量怎么办
(btn3函数里包含了btn4函数,此时btn3函数里所有定义的局部变量,btn4函数都可以直接拿来用,那么btn4则不可以拿到btn3的变量,怎么解决看下面例子)

    function btn3 (){
    var w3=10
    function btn4(){
      var b=4
      // var b=b+w3
      console.log("闭包3:",b) //14
     }
    return btn4
   }
   var a = btn3()
   a()

把btn3函数作为btn4的返回值抛出去。
或者也可以这么写,返回出去一个匿名函数在自执行一下。我觉得闭包和作用域是离不开的,理解闭包首先也要理解作用域,作用域又分为,局部作用域,全局作用域,还有链式作用域,有机会在说作用域啦。。。

   function btn3 (){
     var w3=10
     return function (){
       console.log("闭包3:",w3) 
     }
   }
  btn3()()

总而言之,我理解的闭包简单说就是函数里定义一个函数,外部函数里定义一个内部函数,闭包就是在内外函数做了个衔接,使得内外部函数的局部变量可以拿到。
如果有不同理解和好的建议的。
可以一起分享,一起进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值