JavaScript闭包到底能用来做些什么?

JavaScript闭包是JS前期的一个难点了,但是应用的场景比较少,或者说想不到去使用闭包,那么我们一般在那些场景下会去使用闭包呢?让我们来举几个例子。

场景一:高级函数(可设定一些自定值)

 例题:不同的工厂有不同的合格标准,可能A厂60合格,B厂70合格,C厂80合格...

如何使用闭包来解答这个问题呢?

​
​
// 创建一个构造函数,目的是设定及格线,并返回一个已经设定好合格线的函数
function CreateResultFunction(result){
    function JudgingGrades(number){
        if(number >= result){
            console.log("合格了");
        }else{
            console.log("差" + (result - number) + "合格");
        }
    }
    return JudgingGrades;
}
// 分别定义一个合格线为60的函数,一个合格线为70的函数
var ResultFunction60 = CreateResultFunction(60);
var ResultFunction70 = CreateResultFunction(70);
// 然后就可以使用不同合格线的函数
ResultFunction60(68) //合格了
ResultFunction70(68) //差2合格
 
​

​

使用闭包可以让我们快速创建不同标准的函数。

也让各个函数之间的使用没有歧义。(60合格线的工厂使用60合格线的函数,70合格线的工厂使用70的函数)

场景二:封装JS模块

比如有这样一个需求:定义一个私有变量a,要求a只能被进行指定操作(加减),不能进行其他操作(乘除)。在 Java、C++ 等语言中,有私有属性的概念,但在JS中只能通过闭包模拟。

我们先创建一个 myModule.js 文件:

function myModule() {
    //私有数据
    var msg = 'Qinguyihao Haha'

    //操作私有数据的函数
    function doSomething() {
        console.log('doSomething() ' + msg.toUpperCase()); //字符串大写
    }

    function doOtherthing() {
        console.log('doOtherthing() ' + msg.toLowerCase()) //字符串小写
    }

    //通过【对象字面量】的形式进行包裹,向外暴露多个函数
    return {
        doSomething1: doSomething,
        doOtherthing2: doOtherthing
    }
}

上方代码中,外界只能通过doSomething1和doOtherthing2来操作里面的数据,但不让外界看到里面的具体实现。

然后我们可以尝试在其他的html文件中去使用这个模块中的方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>闭包的应用-自定义JS模块</title>
</head>
<body>
<!--
闭包应用举例: 定义JS模块
  * 具有特定功能的js文件
  * 将所有的数据和功能都封装在一个函数内部(私有的)
  * 【重要】只向外暴露一个包含n个方法的对象或方法
  * 模块的使用者, 只需要调用模块暴露的对象或者方法来实现对应的功能
-->
<script type="text/javascript" src="myModule.js"></script>
<script type="text/javascript">
    var module = myModule();
    module.doSomething1();
    module.doOtherthing2();
</script>
</body>
</html>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值