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>