Effective Javascript 阅读笔记(3)-闭包

在读这篇文章之前,自己听过很多人对闭包的不同的解释,好像一直没有一个确定的定义,而自己对闭包的理解概念:函数在执行的时候会形成一个私有的作用域,函数只想完成之后而且这个作用域不被销毁,就成为闭包。

今天翻阅阮一峰的博客,他在介绍闭包的概念是,是做的这样的解释:

闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

在本书中,对闭包的理解是这样解释的:

  • JavaScript 语序引用在当前函数以外定义的变量
  • 即使外部函数已经返回,当前函数依旧可以医用在外部函数所定义的变量
  • 闭包比创建他们的函数有更长的生命周期
  • 闭包在内部存储器外部变量的引用,并能够读写这些变量

下面对每一句进行列举说明

1、JavaScript 语序引用在当前函数以外定义的变量

function grades(){
    var gradesNum="First grade";
    function student(name){
      return gradesNum+name;
  }
  return student('xiaoming')
}


此处student函数,引用了外部的函数grades中的变量gradesNum

2、即使外部函数已经返回,当前函数依旧可以医用在外部函数所定义的变量

function grades(){
    var gradesNum="First grade";
    function student(name){
      return gradesNum+name;
  }
  return student;
}

var s=grades();
s('xiaoming');
s('xiaohong')

在此函数中,看起来跟上面函数类似,但不同的是,上面的函数直接调用函数student('xiaoming'),但是下面的函数返回的是函数student。s的值为内部的student函数,但实际上s是调用了student函数。即使函数grades已经返回,但是依旧可以记住并且使用gradesNum的值。

我们可以编写更加通用,优雅的函数


3、闭包在内部存储器外部变量的引用,并能够读写这些变量

function grades(){
    var gradesNum=undefined;
   return {
    set:function(newGrades){gradesNum=newGrades},
    get:function(){return gradesNum;},
    type:function(){return typeof gradesNum;}
  }
}


该例子产生了一个包含三个闭包的对象。这三个闭包是set、get、type属性。他们共同访问gradesNum。set闭包更新了其值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值