我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript闭包的简单介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript闭包的简单介绍

本篇内容主要讲解“JavaScript闭包的简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript闭包的简单介绍”吧!


什么是JS闭包?

先看一段代码:

function a(){ 
  var n = 0; 
  function couter() { 
    n++; 
    console.log(n); 
  } 
  couter(); 
  couter(); } a(); //控制台输出1,再输出2

再来看一段代码:

function a(){ 
  var n = 0; 
  this.couter = function () { 
    n++; 
    console.log(n); 
  }; } var c = new a(); c.couter(); //控制台输出1 c.couter(); //控制台输出2

什么是闭包?这就是闭包!简单吧。

有权访问另一个函数作用域内变量的函数都是闭包。这里 couter 函数访问了构造函数 a 里面的变量 n,所以形成了一个闭包。 再来看一段代码:

function a(){ 
  var n = 0; 
  function couter(){ 
    n++; 
    console.log(n); 
  } 
  return couter; } var c = a(); c(); //控制台输出1 c(); //控制台输出2

看看是怎么执行的: var c = a(),这一句 a()返回的是函数 couter,那这句等同于 var c = couter; c(),这一句等同于 couter(); 注意,函数名只是一个标识(指向函数的指针),而()才是执行函数。 后面三句翻译过来就是: var c = couter; couter(); couter();,跟第一段代码有区别吗? 没有。

为什么要这样写?

我们知道,js的每个函数都是一个个小黑屋,它可以获取外界信息,但是外界却无法直接看到里面的内容。将变量 n 放进小黑屋里,除了 couter 函数之外,没有其他办法能接触到变量 n,而且在函数 a 外定义同名的变量 n 也是互不影响的,这就是所谓的增强“封装性”。 而之所以要用 return 返回函数标识 couter,是因为在 a 函数外部无法直接调用 couter 函数,所以 return couter 与外部联系起来,在代码 2 中的 this 也是将 couter 与外部联系起来而已。

常见的陷阱

function createFunctions(){ 
  var result = new Array(); 
  for (var i=0; i < 10; i++){ 
    result[i] = function(){ 
      return i; 
    }; 
  } 
  return result; } var funcs = createFunctions(); for (var i=0; i < funcs.length; i++){ 
  console.log(funcs[i]()); }

乍一看,以为输出 0~9 ,万万没想到输出10个10?

这里的陷阱就是:函数带()才是执行函数! 单纯的一句 var f = fnction() { alert('Hi'); }; 是不会弹窗的,后面接一句 f(); 才会执行函数内部的代码。上面代码翻译一下就是:

var result = new Array(), i; result[0] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换! result[1] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换! ... result[9] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换! i = 10; funcs = result; result = null; console.log(i); // funcs[0]()就是执行 return i 语句,就是返回10 console.log(i); // funcs[1]()就是执行 return i 语句,就是返回10 ... console.log(i); // funcs[9]()就是执行 return i 语句,就是返回10

为什么只垃圾回收了 result,但却不收了 i 呢? 因为 i 还在被 function 引用着啊。好比一个餐厅,盘子总是有限的,所以服务员会去巡台回收空盘子,但还装着菜的盘子他怎么敢收? 当然,你自己手动倒掉了盘子里面的菜(=null),那盘子就会被收走了,这就是所谓的内存回收机制。 至于 i 的值怎么还能保留,其实从文章开头一路读下来,这应该没有什么可以纠结的地方。盘子里面的菜,吃了一块不就应该少一块吗?

总结一下

闭包就是一个函数引用另外一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会徒增内存消耗!另外使用闭包也要注意变量的值是否符合你的要求,因为他就像一个静态私有变量一样。闭包通常会跟很多东西混搭起来,接触多了才能加深理解,这里只是开个头说说基础性的东西。

到此,相信大家对“JavaScript闭包的简单介绍”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript闭包的简单介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript闭包原理与使用介绍

闭包是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,下面这篇文章主要给大家介绍了关于JavaScript闭包函数的相关资料,需要的朋友可以参考下
2022-11-13

C++ OpenMP简单介绍

这篇文章主要介绍了C++ OpenMP简介,OpenMP 还支持自定义数据类型的归约操作,需要通过omp declare reduction指令来声明自定义操作符和数据类型的归约方式,感兴趣的朋友一起看看吧
2023-05-20

201_DMA-BUF简单介绍

一、DMA-BUF等概念的介绍 首先需要明确DMA-BUF,Dma buffer,ION和DMA-BUF Heap是不同的概念。 在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬
2023-08-16

1.AutoMapper简单介绍

官网:http://automapper.org/源码:https://github.com/AutoMapper/AutoMapperNUGET安装: PM> Install-Package AutoMapperAutoMapper是基于对象到对象约定的映射
1.AutoMapper简单介绍
2020-08-26

Django ajax 简单介绍

AJAXAsynchronous Javascript And XML是 "异步Javascript和XML"。即使用 Javascript 语言与服务器进行异步交互,传输的数据为XML。同步交互:客户端发出一个请求后,需要等待服务器响应结
2023-01-31

Django admin简单介绍

生成同步数据库的脚本:python manage.py makemigrations 同步数据库:python manage.py migrate创建后台用户python manage.py createsuperuser访问 admin
2023-01-31

Android中的Adapter简单介绍

Android中的Adapter在自定义显示列表时非常有用,比如SimpleAdapter,它的构造函数是:  public SimpleAdapter (Context context, List> data, int resource,
2022-06-06

编程热搜

目录