闭包

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

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. Postman配置多环境请求地址

    在使用Postman测试接口时,一个项目往往有多个环境(测试.正式等),请求不同环境的接口一般只是IP和端口不一样. 这时候我们可以定义多个环境变量,在接口地址中进行引用. 一.添加环境变量 1.点击 ...

  2. FileZilla链接centos虚拟机不显示问题

    这段时间因为不是很忙,一直想学习一下网络安全方面的技术,准备考个信安中级,网络安全方面经常用到虚拟机,所以及用vm新建虚拟机后,一直发现连不上FileZilla,于是就在网上搜了一下,有一些参考问题, ...

  3. go 的形参

    注意 记录一个 go 语言编程中,可能不小心忽略的一个点, 当函数的 出参 如果是 数组.结构体.字典 类型时,是不需要声明的,可以直接使用. 但是如果 出参 是 指针 类型,则必须要显示的声明. 代 ...

  4. 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的互转 JAVA

    package com.asiabasehk.cgg.util;   /**火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的互转  * Created by macremote on 1 ...

  5. raise EOFError("Compressed file ended before the " EOFError: Compressed file ended before the end-of-stream marker was reached

    参考: EOFError: Compressed file ended before the end-of-stream marker was reached解决办法(在Windows下查看已下载的M ...

  6. vue-cli3配置打包后的文件加上版本号

     修改vue.config.js

  7. mysql报错:MySQL server has gone away

    一.报错提示: 二.报错原因: 原因一: 一种可能是发送的 SQL 语句太长,以致超过了 max_allowed_packet 的大小,如果是这种原因,你只要修改 my.cnf,加大 max_allo ...

  8. 从零搭建hadoop集群之mysql安装

    Linux RPM 方式安装 MySQL在 hadoop02机器上 1. 安装新版mysql前,需将系统自带的mariadb-lib卸载 [root@hadoop02 ~]# rpm -qa|grep ...

  9. 智能风控:python金融风险管理与评分卡建模

    Ch1 互联网金融的申请过程,通常由用户从移动端发起,首次贷款用户会经理申请.四要素验证.授信与额度利率定价.多层审批.用户提款等多个环节:对于还款后再次贷款的复贷客户,平台通常会基于更好的信用评估结 ...

  10. Oracle学习undo之IMU机制

    1.传统undo块 在传统情况下Oracle对待undo表空间和普通表空间是一视同仁的,一个事务开始的时候,在相对空闲的undo回滚段的段头块的事务表获取一个槽位,把事务信息写上,有可能: 1.1.段 ...