闭包

    拿一个可以记录函数调用次数的来进行理解,如下方

let n = 0
function numUp(){
n++
console.log(n)
}
const fn = numUp()
fn() // n=1
fn() // n=2
n+=10
fn() // n=13

    很明显可以发现,我们定义了一个全局变量n来记录numUp函数的调用次数,但是全局变量n在遭到numUp函数之外的改变后,n并不能正确的反映出numUp函数的调用次数,因此我们需要引用闭包的概念

function numUp(){
let n=0
function numRise(){
n++
console.log(n)
}
return numRise
}
const fn = numUp()
fn() // n=1
fn() // n=2
n+=10
fn() // n=3

  不难发现当我们使用了闭包也就是函数嵌套的形式去记录函数调用的次数时,则不会在受到函数之外的程序的干扰,其核心就在于实现了数据的私有制,函数外部只能使用私有数据,而不能修改私有数据,因此该类数据可以完完全全地被正确的使用。

  但闭包也会引起内存泄露,众所周知,全局变量是不会被销毁的(除非关闭页面),而一般来说一个普通的函数在使用后自身以及自身内部的临时变量(局部变量)都会被销毁,但是在上述闭包形式的写法中,我们定义了一个全局变量fn来引用函数numUp,而numUp函数返回值为内部函数numRise,而numRise内部又可以找到外部变量n,因此此时的n将不会被回收销毁,因此在此处引起了内存泄露。

关于js闭包的基础理解的更多相关文章

  1. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  2. 对js闭包的粗浅理解

    只能是粗浅的,毕竟js用法太灵活. 首先抛概念:闭包(closure)是函数对象与变量作用域链在某种形式上的关联,是一种对变量的获取机制.这样写鬼能看懂. 所以要大致搞清三个东西:函数对象(funct ...

  3. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  4. js闭包(closure),个人理解

    一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数 ...

  5. Js函数function基础理解

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  6. javascript深入理解js闭包(个人理解,大神勿喷)

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  7. JS闭包的简单理解。优缺点以及垃圾回收机制

    闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...

  8. js闭包的真正理解

    <高级程序设计>上,这样说:当在函数内部定义了其他函数时候,就创建了闭包.闭包有权访问包含函数内部的所有变量. 这个说的太晦涩了,而且我觉得很容易理解错,闭包就是一个嵌套函数嘛?但是我觉得 ...

  9. js 闭包的简单理解

    let a = function(){ var i=0; let b = function(){ i++; alert(i); } return b; } let c = a(); c(); 这段代码 ...

  10. 关于JS闭包的一点理解

    通常来讲,闭包通常是指函数内部可以访问到外部作用域的一个过程. 一.广义的定义:任何函数都产生了闭包. 二.狭义的定义:函数内部能访问到其他变量函数的作用域. 我们来看个例子 var a = 10; ...

随机推荐

  1. Hadoop完全分布式开发配置流程

    完全分布式开发 整体流程 1.准备3台纯净虚拟机 2.修改每台ip,主机名,主机映射,关闭防火墙 3.安装jdk和hadoop,配置环境变量 4.集群分发脚本编写 5.集群配置 6.ssh免密登录 7 ...

  2. 【msys2】更新镜像源

    更新镜像源 镜像源的地址如:D:\msys64\etc\pacman.d 从下面选择镜像源剪切到Primary中第一行: 如下图,目录底下的所有都需要更改: 之后需要强制更新一下列表,https:// ...

  3. 【当年笔记】集合之Queue队列

    1)Queue 分类 双端队列:双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取. 阻塞队列:阻塞队列指的是指添加或删除元素时,如果没有成功,会阻 ...

  4. (0524) rbf 格式 (intel)

    http://blog.chinaaet.com/yuwoo/p/5100049901 https://blog.csdn.net/qq_38531460/article/details/107066 ...

  5. 【Pr】如何将音频剪成多段批量导出

    如何将音频剪成多段批量导出 需要软件: Pr, Adobe Media Encoder (时间线窗口中) 用剃刀将音频割成多段 (时间线窗口中) 选中音频右键 | 嵌套 | 输入名字 (嵌套快捷键:A ...

  6. http 1.0、2.0、3.0 之间的区别

    首先是HTTP协议: HTTP 是 HyperText Transfer Protocol(超文本传输协议)的缩写,它是互联网上应用最为广泛的一种网络协议,所有 WWW 文件都必须遵守这个标准.其他的 ...

  7. DOS批处理命令,自动获取本机系统及硬件配置信息

    可以配合域策略自动下发执行, 批量收集域内电脑配置; 手动执行亦可; 如下保存成.bat批处理文件执行即可. /*&cls&echo off&cd /d "%~dp0 ...

  8. Centos7 安装Seata,注册中心选择nocas

    前言 1.什么是分布式事务,分布式事务包含哪些角色 分布式事务主要包含,事务参与者,事务管理者,资源服务器三个角色.分布式事务是指着三个角色分别位于不同的分布式系统的不同节点之上.简单的说,就是一次大 ...

  9. springboot配置文件中的基本配置

    #应用启动端口设置server.port=9088#=================================微信相关====================================# ...

  10. oracl ocp认证到底有没有用!!!

    从一个网友听说有个OCP专家认证,我们本地也有,要1万3,问题是我想真的学东西而不是为了考证,不知道这个培训能学到多少呀.