javascript核心技术(四十五)深入学习函数(三) 闭包函数的原理

[复制链接]
查看: 1630|回复: 31
发表于 2023-1-28 18:23:03 | 显示全部楼层 | 阅读模式
在将闭包之前我们首先需要重复说明一下作用域的问题。
在前面我们讲过,函数的内部可以使用函数外部的变量,而函数外部不能使用函数内部的变量。
因为函数内部的变量是局部变量,而函数外部的变量为全局变量。
那么,如果我们就是想在函数外部使用函数内部的变量怎么办呢?

这有两种解决办法:
一、闭包函数
二、回调函数

何为闭包函数
在函数内部返回一个函数,返回的这个函数就称为闭包函数。
由于函数内部的函数的作用域为函数内部,又由于变量的作用域始终是变量定义的位置,所以,当我们返回内部函数时,连同函数内部的作用域也一同返回了。
这样一来闭包函数就获得了函数内部的作用域,当然就可以使用内部的变量了。

在讲闭包函数之前,我们还是再来回忆一下变量的作用域
请看以下代码
<!DOCTYPE html>
<html>
<head>
        <title>变量的作用域始终是变量定位的位置</title>
        <script src="./jquery.js"></script>
</head>
<body>
        <script type="text/javascript">
                var num = 100;
                var f = function () {
                        console.log(num);
                };

                function f1() {
                        var num = 200;
                        f();
                }
                f1();
        </script>
</body>

</html>




在以上代码中,我们在函数的外部定义了一个num变量并赋值为100,在f1函数的内部又定义了一个num变量并赋值为200.
然后在f1函数内部调用f函数,然后在外部调用f1函数。
大家可以想一下,输出结果是什么?
不错,是100,因为f函数内部没有定义num变量,所以它顺着作用域链向上找,找到了num=100。

再看下面的例子

<!DOCTYPE html>
<html>
<head>
        <title>变量的作用域始终是变量定位的位置</title>
        <script src="./jquery.js"></script>
</head>
<body>
        <script type="text/javascript">
        var num = 100;
        var f = function(){
                console.log(num);
        };

        function f1(){
                var num = 200;
                return f;
        }
        var res = f1(); // res 就是 f函数
        res();
        </script>
</body>
</html>

在上面的代码中,我们分别定义了f和f1两个函数,在f1中定义了一个num变量并赋值为200,然后将f函数返回,由res变量接收,那么res()就等于f(),那么请问输出的结果什么?
没错,还是100,因为变量的作用域始终在变量定义的位置,与调用位置毫无关系。

为什么不停的说这一点呢,因为在编程过程中常常会搞不清楚某个变量到底指向的谁。

通过上面的实验我们似乎明白了点什么,如果我们想要获得函数内部的作用域,即:想要在函数外部使用函数内部的变量,是不是把函数定义到内部,然后再把函数返回给外部就可以了呢?是的,这就叫做闭包。

请看下面的代码:
<!DOCTYPE html>
<html>
<head>
        <title>变量的作用域始终是变量定位的位置</title>
        <script src="./jquery.js"></script>
</head>
<body>
        <script type="text/javascript">
                var num = 200;
                function f1() {
                        var num = 100;
                        function f2() {
                                console.log(num);
                        }
                        return f2;
                }
                var res = f1();
                res(); //相当于在f1函数外面调用了f2函数,使用到了f1函数内部的变量,这种方式就是写了一个闭包
        </script>
</body>

</html>

javascript核心技术(四十五)深入学习函数(三) 闭包函数的原理

输出结果为100,它真的使用了函数内部的变量,有木有?

以上就是闭包函数的原理。
之所以这样用,是因为我们常常为了防止命名冲突,会将代码写到一个匿名函数中,然而我们又想在匿名函数外部使用匿名函数内部的变量,闭包函数它解决的就是这种函数外部使用函数内部变量的问题。
再次重复:匿名函数中返回的那个函数叫做闭包函数,这个匿名函数叫做闭包。


易博软件介绍

0

主题

33

帖子

18

积分

营销入门

Rank: 2

积分
18
发表于 2023-2-22 20:08:02 | 显示全部楼层
我真的很受启发!

0

主题

29

帖子

16

积分

营销入门

Rank: 2

积分
16
发表于 2023-3-5 23:26:50 | 显示全部楼层
学海无涯!  生命不息,学习不止!   

0

主题

21

帖子

11

积分

营销入门

Rank: 2

积分
11
发表于 2023-3-16 18:14:15 | 显示全部楼层
写的很好,想成为一个好的程序员,需要努力努力再努力!!!

0

主题

25

帖子

14

积分

营销入门

Rank: 2

积分
14
发表于 2023-3-25 23:41:35 | 显示全部楼层
8错  8错

0

主题

11

帖子

6

积分

营销入门

Rank: 2

积分
6
发表于 2023-4-1 12:03:57 | 显示全部楼层
我是新手我看不懂你的那些符号可是我在看你写的那些体验上很手感动    很好我这个人不喜欢看别人写的东西我是经过一个网上的好朋友介绍的    你写的很好可是我要是能看懂你写的那写符号就好了那就跟能体会你的    内心感觉我想和你做个朋友你想吗??想的话就在我发的帖子上留下你的    电子邮箱.

0

主题

18

帖子

10

积分

营销入门

Rank: 2

积分
10
发表于 2023-4-6 06:06:34 | 显示全部楼层
至心至腑~~~~~~~~~`

0

主题

21

帖子

11

积分

营销入门

Rank: 2

积分
11
发表于 2023-4-11 09:07:10 | 显示全部楼层
在其他地方看到过,很受欢迎的一篇文章  在其他地方看到过,很受欢迎的一篇文章  这个吗~学校就是这个样子的啦~、  大多数还是靠自己,,,,,,,。。。。。。。。。  算了~反正我也是个菜鸟,。,,,没资格说些什么~、  看了你的文章,真有点感触·
发表于 2023-4-15 16:58:21 | 显示全部楼层
很有感悟 好文章

0

主题

18

帖子

10

积分

营销入门

Rank: 2

积分
10
发表于 2023-4-20 22:12:04 | 显示全部楼层
写得真好,是学习的榜样  在失败中认识自己,在失败中寻找自己,在失败中战胜自己.  你的故事给我的感受就是:我们是菜,但我们一定能做的更好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

返回顶部 返回列表