JS的闭包 (一)——为什么要用闭包

时间:2021-11-21 22:46:23

最近在学习js时,遇到一个比较难的概念,闭包,在这里与大家分享一下我的学习心得。


使用闭包,我们一定要明白为什么,何时使用闭包。
在网上查阅资料,阮一峰的博客里面介绍道:
我们知道js的函数内部局部变量在函数执行完之后就销毁了。

“出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。这种方法就是闭包”。

举个教材中的例子:

比如我们现在有一项需求,需要排序两个对象。创造数组:数组格式如下:

var data =[ 
person1 = {
name : 'Li',
age: 18,
mathGrade : 100,
engGrade: 'A'
},
person2 = {
name : 'Zhang',
age: 20,
mathGrade : 120,
engGrade: 'C'
}
];

js对于数组有一个排序方法sort()。

sort()函数有两种用法:

(1)
Arr1.sort(); //直接按数组的字母顺序排列
(2)
Arr2.sort(compareFunction)//根据比较函数排序

那么如果我们需要根据不同属性对上述对象排列呢?很自然的想法,我们会把属性作为一个变量,然后读取属性值。无论怎么样,我们一定需要一个比较函数。
但是sort的比较函数只能有两个参数变量,我们现在需要引进对象属性这样一个第三个参数变量。即我们需要在一个函数中引入另外一个函数的变量。
大多数时候我们可以创建全局变量。按照这种思路,我们代码如下:

var property; // 对象属性
property = 'mathGrade';
function compareFunc(obj1,obj2){
var value1 = obj1[property];
var value2 = obj2[property];
if (value1 > value2){
return 1;
}else if (value1 < value2){
return -1;
}else{
return 0;
}
}
console.log(data.sort(compareFunc));

但是这种情况下,我们改变变量很不方便,也不够灵活。我们希望最好的方式,就是在排序的时候可以直接选择属性。
出于这种原因,我们需要引进一个函数来读取对象属性这个变量,并使用。于是我们引入闭包。闭包的写法如下,将我们需要使用的函数作为内函数,外函数只是作为变量的输出。

function compareFunc(property){
return function(obj1,obj2){
var value1 = obj1[property];
var value2 = obj2[property];
if (value1 > value2){
return 1;
}else if (value1 < value2){
return -1;
}else{
return 0;
}
}
}
console.log(data.sort(compareFunc("mathGrade")));

就达成我们的目的了