javascript核心技术(四十五)深入学习函数(四) 闭包函数的应用

[复制链接]
查看: 1579|回复: 31
发表于 2023-1-28 18:48:15 | 显示全部楼层 | 阅读模式
下面我们来看一个闭包函数的应用,前面我们讲过图和给元素批量绑定事件。
如果我们使用for循环来实现它会产生一个变量丢失的问题,这时如果使用闭包就能解决这个问题,当然,在es6中,只要用let声明变量也可以解决该问题。
这里只是为了说明闭包的意义,请看下面的代码:
<!DOCTYPE html>
<html>
<head>
        <title>变量的作用域始终是变量定位的位置</title>
        <script src="./jquery.js"></script>
</head>
<body>
        <ul>
                <li>li1</li>
                <li>li2</li>
                <li>li3</li>
                <li>li4</li>
                <li>li5</li>
        </ul>
        <script type="text/javascript">
        var lis = document.querySelectorAll('li');
        for(var i=0; i<lis.length; i++){
                lis[i].onclick = function(){
                        //输出 我是第 几 个li标签
                        console.log('我是第 ' + i + ' 个li标签');
                }
        }
        </script>
</body>

</html>


javascript核心技术(四十五)深入学习函数(四) 闭包函数的应用

通过上面的实验我们看到,我们使用for循环给所有的li标签分别绑定了点击事件,但是,当我们点击每一个li标签时,它们获取到变量i都是同一个值:5,这就有点尴尬了。

下面我们用闭包试试看
<!DOCTYPE html>
<html>
<head>
        <title>变量的作用域始终是变量定位的位置</title>
        <script src="./jquery.js"></script>
</head>
<body>
        <ul>
                <li>li1</li>
                <li>li2</li>
                <li>li3</li>
                <li>li4</li>
                <li>li5</li>
        </ul>
        <script type="text/javascript">
        var lis = document.querySelectorAll('li');
        for(var i=0; i<lis.length; i++){
                //套一层匿名函数自调用,形成了一个闭包环境
                //主要作用是形成一个局部作用域
                (function(m){
                        lis[m].onclick = function(){
                                console.log('我是第 ' + m + ' 个li标签');
                        }
                })(i);//每次循环就把i传入,这样每次调用都会得到一个独立的作用域,等同于循环了5次,创建了5个局部作用域。
        }
        </script>
</body>

</html>

javascript核心技术(四十五)深入学习函数(四) 闭包函数的应用

这样就将i的值全部保存了下来。
当然,在ES6中根本不需要这么复杂,我们使用let声明i变量即可解决,如下:
<!DOCTYPE html>
<html>
<head>
        <title>变量的作用域始终是变量定位的位置</title>
        <script src="./jquery.js"></script>
</head>
<body>
        <ul>
                <li>li1</li>
                <li>li2</li>
                <li>li3</li>
                <li>li4</li>
                <li>li5</li>
        </ul>
        <script type="text/javascript">
        var lis = document.querySelectorAll('li');
        for(let i=0; i<lis.length; i++){
                lis[i].onclick = function(){
                        console.log('我是第 ' + i + ' 个li标签');
                }
        }
        </script>
</body>
</html>

javascript核心技术(四十五)深入学习函数(四) 闭包函数的应用

同样得到了闭包实现的结果。

还是那句话,闭包主要解决的是:为了防止命名冲突而使用匿名函数包裹一堆代码,从而形成一个封闭的空间,当我们想在匿名函数外部使用匿名函数内部的变量时,就把匿名函数的作用域返回给外部。


以上案例并非闭包函数的初衷,仅是一个巧用而已。

易博软件介绍

0

主题

33

帖子

18

积分

营销入门

Rank: 2

积分
18
发表于 2023-2-22 20:08:02 | 显示全部楼层
努力也

0

主题

24

帖子

13

积分

营销入门

Rank: 2

积分
13
发表于 2023-3-5 17:24:34 | 显示全部楼层
学海无涯!  生命不息,学习不止!   

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-3-16 04:07:20 | 显示全部楼层
楼主,多谢啦!
发表于 2023-3-24 22:30:23 | 显示全部楼层
很好啊,是真的啊  看过了有好多的感慨啊!!!!!!!!!!!

0

主题

3

帖子

2

积分

终身会员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
2
发表于 2023-3-31 13:49:59 | 显示全部楼层
让我又有了奋斗精神

0

主题

17

帖子

9

积分

营销入门

Rank: 2

积分
9
发表于 2023-4-4 17:45:36 | 显示全部楼层
谢谢楼主:  从你的文章中我学会很多!

0

主题

18

帖子

10

积分

营销入门

Rank: 2

积分
10
发表于 2023-4-10 00:48:26 | 显示全部楼层
^是南大小百合上的帖子,很早就看过了

0

主题

12

帖子

7

积分

营销入门

Rank: 2

积分
7
发表于 2023-4-14 19:48:17 | 显示全部楼层
成功/对我来说,,成功就是一个新的起点,,什么叫成功,我才刚上路咧  引用发哥的话,。  无论什么时候,我们都要想的是一个新的起点,这样我们才不会满足现状,目标也会更清晰  现在的我自信心越来越膨胀,我感觉有种云里雾里的感觉可能得来太容易了,我发现我太狂了,言不由衷。  
发表于 2023-4-19 17:53:52 | 显示全部楼层
看了这片文章很受感触呢!!!!!!!谢谢搂主!!!!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表