Dart学习笔记 闭包

闭包

myClosure(){
  var a = 0; // a是一个局部变量.函数执行完毕后将被清理
  return (){
    a++;
    print(a);
  };
}
var fn = myClosure();
fn();
fn();
fn();

返回值:1 2 3

以上是网上复制的一段代码
因为本人是第一次接触闭包的操作(没有学过js),第一次看到闭包有些难以理解

  • 为什么使用fn来接收一个函数
  • 为什么fn接收完函数以后又可以以fn()的形式进行调用?
  • 为什么myClosure()函数return以后没没有结束,a的值还在累加?

遂去网上查找闭包相关的资料,看到这一段后终于理解了

代码
function a(){
  var i=0;
  function b(){
    alert(++i);
  }
  return b;
}var c=a();
c();
特点

这段代码有两个特点:

1、函数b嵌套在函数a内部;

2、函数a返回函数b。

这样在执行完var c=a( )后,变量c实际上是指向了函数b,
再执行c()后就会弹出一个窗口显示i的值(第一次为1)。
这段代码其实就创建了一个闭包,这是因为函数a外的变量c引用了函数a内的函数b。
也就是说,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

作用

简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。

看完这段话后,再返回来看这段代码:

myClosure(){
  var a = 0; // a是一个局部变量.函数执行完毕后将被清理
  return (){
    a++;
    print(a);
  };
}
var fn = myClosure();
fn();
fn();
fn();

这里用fn接收了myClosure()的返回值,也就是方法内的匿名函数

  (){
    a++;
    print(a);
  };

之后每次调用fn(),就等于在调用这个匿名函数

又因为这个匿名函数调用了myClosure()中声明的局部变量a,所以a不会被垃圾回收机制回收

故打印出来的a的值是递增的

闭包的作用
  • 可以使想要使用的变量常驻于内存,同时也不会污染全局
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值