转行前端自学学习记录——JS闭包

最近在看《JS高级程序设计》,也就是红宝书。从第六章开始,就开始有点吃力了,毕竟是JS里面最有特点也最难的部分了,原型继承,紧接着就是闭包封装了。通过MDN的铺垫,以及死啃了好几天,勉强能理解了,至于能不能用还不知道。对于闭包,一开始也是一头雾水,今天通过看转载在w3c中文网里面的阮一峰js闭包学习笔记,才慢慢有点理解了。

闭包,通俗得讲,就是嵌套在一个函数里面的一个函数。目前我最常见到的都是用匿名函数来创建的。而闭包的一个特点,就是能够访问其上一层极的函数作用域里面的变量,比如:


利用函数表达式,将函数赋值给变量add,函数又返回一个匿名函数(闭包),其访问了父函数的counter变量,每执行一次函数,counter就会增加1,一开始怎么都不理解为什么,总是觉得每次调用函数,不都是会初始化变量counter=0的吗,后来才慢慢理解,对于一般的函数,比如:


每次调用完了之后,counter这个局部变量就会被销毁,所以第二次调用又会初始化为0,而在闭包中,由于闭包要使用父函数的变量,所以每次调用完之后,变量counter并没有被销毁,而是存储在内存里,所以才会每次执行操作,都会让counter加1.就像第一张图示显示的一样。

2、由于闭包本身是函数,所以就会有专属的作用域,通过这个特点,就能弥补了JS没有块级作用域的遗憾。就像第一张图表示那样(function(){块级作用域})(),利用闭包,创建了只属于某个执行环境的变量,比如里面的counter通过外部是无法访问的,只能通过返回闭包来访问。间接让从外部操作函数局部变量成为可能。比如在函数内部可以通过闭包创建一个外部可以调用的公有方法(特权方法),旨在外部环境操作函数内部变量。

3、闭包的另一个特点是,作用域只能向上延长一级,看下面两张图



首先理解this的指向,通俗的理解就是调用方法(函数)的对象的作用域里的变量。比如第一张图,闭包返回的this.name,this指向的就是外部函数作用域中的name变量,很显然,外部函数不带任何变量,所以this无法指向函数中的任何变量,这种情况下,因为无法再向上一级作用域访问变量,而在全局作用域中有一个变量name,所以this就默认指向了全局变量name,于是调用函数getNameFuncName()()返回了“The Window”。

第二张图中,在外部函数先把this赋值给了一个变量that。外部函数的this指向调用函数的作用域里的变量,实则就是object里相关变量,赋值语句将this作用域赋给了that,即object作用域,在闭包里,返回的that.name实则就是object.name,所以调用函数getNameFuncName()()返回了“My Object”。

综上,闭包主要有几点用处:1、访问函数局部变量;2、创建块级作用域;3、变量保持(内存占用),基于这点最好不滥用闭包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值