关于js闭包的基础理解
闭包
拿一个可以记录函数调用次数的来进行理解,如下方
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闭包的基础理解的更多相关文章
- js闭包之初步理解( JavaScript closure)
闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...
- 对js闭包的粗浅理解
只能是粗浅的,毕竟js用法太灵活. 首先抛概念:闭包(closure)是函数对象与变量作用域链在某种形式上的关联,是一种对变量的获取机制.这样写鬼能看懂. 所以要大致搞清三个东西:函数对象(funct ...
- (原创)JS闭包看代码理解
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- js闭包(closure),个人理解
一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数 ...
- Js函数function基础理解
正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...
- javascript深入理解js闭包(个人理解,大神勿喷)
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- JS闭包的简单理解。优缺点以及垃圾回收机制
闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...
- js闭包的真正理解
<高级程序设计>上,这样说:当在函数内部定义了其他函数时候,就创建了闭包.闭包有权访问包含函数内部的所有变量. 这个说的太晦涩了,而且我觉得很容易理解错,闭包就是一个嵌套函数嘛?但是我觉得 ...
- js 闭包的简单理解
let a = function(){ var i=0; let b = function(){ i++; alert(i); } return b; } let c = a(); c(); 这段代码 ...
- 关于JS闭包的一点理解
通常来讲,闭包通常是指函数内部可以访问到外部作用域的一个过程. 一.广义的定义:任何函数都产生了闭包. 二.狭义的定义:函数内部能访问到其他变量函数的作用域. 我们来看个例子 var a = 10; ...
随机推荐
- redis的linux下安装
Linux 源码安装 下载地址:http://redis.io/download,下载最新稳定版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: # wget http://downloa ...
- Django安装与启动
安装 python -m pip install Django 查看版本 python -m django --version打开命令行,cd 到一个你想放置你代码的目录,然后运行以下命令: dja ...
- vue3 门户网站搭建2-ngnix
路由配好了,需要调试下 build 后是否可用,这时我们需要一个服务端来运行静态网页. 官网直接下载一个 windows 版本的 ngnix 即可: http://nginx.org/en/downl ...
- 在输入shell命令的list_namespace时,报 :org.apache.hadoop.hbase.PleaseHoldException: Master is initializing。
今天弄了一下午这个问题,弄到了将近十点,终于解决了,终于解决这个问题了,感谢旭旭大佬相助,不再报错了. 本来今天中午,我已经弄好了,结果我午睡了一下再看就报错了,哎.今天本来已经绝望了,后来问了一下大 ...
- golang yaml配置
Redis配置文件结构体 package config type Redis struct { Host string `yaml:"host"` Password string ...
- top单核与32C--CPU爆表
linux的cpu使用频率是根据cpu个数和核数决定的 top, 然后你按一下键盘的1,这就是单个核心的负载,不然是所有核心的负载相加,自然会超过100 单核为100%,服务器是32核的,下面基本用了 ...
- mybatis的自定义类型转化器如何使用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- py10函数之嵌套-名称空间作用域
# 函数是第一类对象:函数名指向的值可以被当中参数传递 # 1.函数名可以被传递# name = 'jason'# x = name# print(x)# print(id(x))# def func ...
- 【C和指针】6.指针
1.指针变量的内容 int a=112, b=-1; float c=3.14; int *d=&a; int *e=&c; (1) 变量d和e被声明为指针,并用其他变量的地址予以初始 ...
- jar包启动脚本, 以及外置配置文件application.yml
想使用sh脚本来启动,停止,重启我们的jar服务, 顺便还要外置配置文件方便修改 示例server.sh如下,启动命令为sh server.sh start或restart或stop,修改其中的这几个 ...