广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >JavaScript闭包的简单介绍
  • 582
分享到

JavaScript闭包的简单介绍

2024-04-02 19:04:59 582人浏览 薄情痞子
摘要

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

本篇内容主要讲解“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闭包的简单介绍”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JavaScript闭包的简单介绍

本文链接: https://www.lsjlt.com/news/79722.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • JavaScript闭包的简单介绍
    本篇内容主要讲解“JavaScript闭包的简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript闭包的简单介绍”吧!什么是JS闭包?先看一...
    99+
    2022-10-19
  • JavaScript中闭包的简单应用
    这篇文章主要讲解了“JavaScript中闭包的简单应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中闭包的简单应用”吧!闭包定义在J...
    99+
    2022-10-19
  • JavaScript组合模式的简单介绍
    这篇文章主要介绍“JavaScript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2022-10-19
  • JavaScript事件类型的简单介绍
    这篇文章主要讲解了“JavaScript事件类型的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript事件类型的简单介绍”吧!DOM事...
    99+
    2022-10-19
  • JavaScript闭包原理与使用介绍
    目录1. 认识闭包2. 变量的作用域和生命周期2.1 变量的作用域2.2 变量的生命周期3. 闭包的概念及其作用3.1 闭包的概念3.2 闭包的应用3.2.1 保存私有变量3.2.2...
    99+
    2022-11-13
    JavaScript闭包 JS闭包
  • JavaScript的闭包与变量作用域介绍
    这篇文章主要讲解了“JavaScript的闭包与变量作用域介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的闭包与变量作用域介绍”吧!...
    99+
    2022-10-19
  • Python闭包技巧介绍
    目录1.闭包:用函数代替类2.访问定义在闭包的内的变量1.闭包:用函数代替类 有时我们会定义只有一个方法(除了__init__()之外)的类,而这种类可以通过使用闭包(closur...
    99+
    2022-11-12
  • Django admin简单介绍
    生成同步数据库的脚本: python manage.py makemigrations 同步数据库: python manage.py migrate 创建后台用户 python manage.py createsuperuser 访...
    99+
    2023-01-31
    简单 Django admin
  • Django ajax 简单介绍
    AJAX Asynchronous Javascript And XML是 "异步Javascript和XML"。即使用 Javascript 语言与服务器进行异步交互,传输的数据为XML。 同步交互:客户端发出一个请求后,需要等待服务器...
    99+
    2023-01-31
    简单 Django ajax
  • C++ OpenMP简单介绍
    目录一、背景知识1、program作用2、C++不同版本区别二、什么是OpenMP三、关键字1、reduction 作用2、default(shared)作用一、背景知识 1、pro...
    99+
    2023-05-20
    c++ OpenMP简介 c++ OpenMP
  • Android Socket 简单介绍
    文章目录 前言一、Socket是什么?百度百科的解释我自己的理解 二、简单示例1.服务端2.客户端3.布局4.实现 参考总结 前言 最近需求需要使用Socket进行通讯,我在工作...
    99+
    2023-09-23
    android
  • 4:GTID简单介绍
    概述: 当使用GTIDs时,可以识别和跟踪每一个事务,因为它是在原始服务器上提交的,并由任何slave应用;简单来说就是master提交的所有事务都在slaves应用一次,两者的数据就能保证一致性,此外,...
    99+
    2022-10-18
  • oracle lob 简单介绍
    何为LOB?lob为oracle数据库的一个大对象数据类型,可以存储超过4000bytes的字符串,二进制数据,OS文件等大对象信息.最大可存储的容量根oracle的版本和oracle 块大小有关.有那几种...
    99+
    2022-10-18
  • 1.AutoMapper简单介绍
    官网:http://automapper.org/ 源码:https://github.com/AutoMapper/AutoMapper NUGET安装: PM> Install-Package AutoMapper Au...
    99+
    2020-08-26
    1.AutoMapper简单介绍
  • 201_DMA-BUF简单介绍
    一、DMA-BUF等概念的介绍 首先需要明确DMA-BUF,Dma buffer,ION和DMA-BUF Heap是不同的概念。 在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬...
    99+
    2023-08-16
    linux android java 缓存
  • 免杀简单介绍
    免杀简单介绍 免杀是什么? ​ 免杀,指的是一种能使病毒木马免于被杀毒软件查杀的技术。 为什么要制作免杀? ​ 当前不论是个人PC还是服务器都有杀软,如个人PCwindows操作系统自带的 W...
    99+
    2023-09-01
    服务器 php 运维
  • javaScript深拷贝和浅拷贝的简单介绍
    目录基本数据类型在数据结构当中引用数据类型浅拷贝-深拷贝浅拷贝浅拷贝小结深拷贝结尾源码地址在了解深拷贝和浅拷贝之前,我们先梳理一下: JavaScript中,分为基本数据类型(原始值...
    99+
    2022-11-13
  • scrapy框架的简单介绍
    这篇文章主要介绍“scrapy框架的简单介绍”,在日常操作中,相信很多人在scrapy框架的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”scrapy框架的简单介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • PyTorch中的torch.cat简单介绍
    目录1.toych简单介绍2.张量Tensors3.torch.cat1.toych简单介绍 包torch包含了多维疑是的数据结构及基于其上的多种数学操作。 torch包含了多维张量...
    99+
    2022-11-13
  • python中的json简单介绍
    这篇文章主要讲解了“python中的json简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的json简单介绍”吧! ...
    99+
    2022-10-18
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作