web前台学习:深入了解JS闭包

作者 : 开心源码 本文共1836个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共213人阅读

第一部分:初遇闭包

http://www.runoob.com/js/js-function-closures.html

什么是闭包?闭包有什么作使用?这是我遇到闭包时的第一反应。

闭包在JavaScript高级程序设计(第3版)中是这样形容:闭包是指有权访问另一个函数作使用域中的变量的函数。

那么闭包的作使用也就很显著了。

1. 可以在函数的外部访问到函数内部的局部变量。

2. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。

在上面的代码中,闭包指的就是function () {return counter += 1;}这个函数。首先解释一下这段代码,在变量add被赋值之前,第一个function执行了一次(执行且仅会执行一次),由于这是一个函数表达式公告方式并且公告后加上了(),所以会自动执行一次。执行后add被赋值(匿名函数)了,add= function () {return counter += 1;}。而后每次调使用add()函数时,返回的都是这个函数,由于这个函数在第一个函数的内部,所以即便第一个函数执行完了,第二个函数仍然能访问counter(JS设计的作使用域链,当前作使用域能访问上级的作使用域)。

闭包是可以在另一个函数的外部访问到其作使用域中的变量的函数。而被访问的变量可以和函数一同存在。即便另一个函数已经运行结束,导致创立变量的环境销毁,也仍然会存在,直到访问变量的那个函数被销毁。当然,假如仅仅是做一个简单的计数器,大可不使用这样麻烦。下面这简短的代码就能轻松实现。

var a = 0;

function myFunction(){

a++;

? ? document.getElementById(“demo”).innerHTML = a;

}

第二部分:牛客翻船

https://www.nowcoder.com/questionTerminal/da4115e308c948169a9a73e50d09a3e7

下面是这个题目的解答:

每个li标签的onclick事件执行时,本身onclick绑定的function的作使用域中没有变量i,i为undefined,则解析引擎会寻觅父级作使用域,发现父级作使用域中有i,且for循环绑定事件结束后,i已经赋值为4,所以每个li标签的onclick事件执行时,alert的都是父作使用域中的i,也就是4。这是作使用域的问题。

闭包只能获得包含函数中任何变量的最后一个值。由于别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。

这是在循环体中创立闭包的常见错误。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures(肯定要看这篇)

这里面给onclick赋值的是闭包。很多人会问为什么是闭包?之前闭包不是函数A里的函数B吗?函数B使用来访问函数A的变量,称函数B是闭包,题目中只有一个函数为什么也是闭包。其实,使用两个函数形成闭包只是一般形式。闭包真正的含义是,假如一个函数访问了此函数的父级及父级以上的作使用域变量,即可以称这个函数是一个闭包。

??? var a = 1;

????(function test (){

alert(a);

})()

所以上面的function都可以称之为闭包(匿名闭包函数)。

这里还是作使用域的问题,那么我们把每次的i都保存到一个变量中,匿名闭包即可以实现想要的效果。

这样就用了闭包,这里面的闭包指的是function() {alert(num);};第二个function里面弹出的num是第一个function的参数,通过(i)执行了这里面的第一个函数,同时i的值被保存到num中。每个点击事件中都有一个局部变量num,num保存的是相应的i值。

第三部分:let的横空出世

上面的牛客题目只要要将for(var i=0;ihttps://mp.csdn.net/postedit/81065540

let的到来,让令人诟病的JS取得了一丝生机,也补上了JS没有块级作使用域的短板。ECMAScript6还有很多新特性,笔者也在不断学习中。

第四部分:闭包的应使用

函数工厂和闭包模拟私有方法

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures(这篇讲得很好,希望大家读透)

感谢阅读

喜欢看小编文章的点个订阅或者者喜欢!小编每天都会跟大家分享文章,也会给大家提供web前台学习资料。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » web前台学习:深入了解JS闭包

发表回复