(一) 闭包是什么, 闭包形成的原因
闭包的概念:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包最常用的方式就是在一个函数内部创建另一个函数(函数中的函数)。
简单概括: 闭包就是一个能访问另外一个函数内部变量的函数
闭包形成的原因:函数内部的局部变量一般在函数运行结束的时候就会被销毁, 但如果局部变量因为被外部引用而导致没有被销毁, 就形成了闭包
(二) 闭包有哪些作用
1.封装私有变量(私有属性)
function getCat() {
var name = '白猫';
return {
getName: function() {
return name;
},
setName: function(newName) {
name = newName;
}
}
}
var cat = getCat();
cat.getName(); // 白猫
cat.setName('黑猫');
cat.getName(); // 黑猫
私有变量(私有属性)是后台语言经常用的东西,意思是这个属性是私有的,不能随意更改,要改,必须通过指定的set和get方法进行获取和修改
2.模仿块级作用域(ES5中没有块级作用域)
// 函数自调用
var num = 100;
(function(aa) {
console.log(aa);
})(num);
// 根据以下代码,说出打印结果
for (var i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, i * 100);
}
// 结果是打印了10个10,并不是我们希望0-9,要想实现我们期待的结果可以使用闭包实现
for (var i = 0; i < 10; i++) {
(function(j) {
setTimeout(() => {
console.log(j);
}, j * 100);
})(i);
}
/**
* 上面的代码,循环了10次,创建了10个函数,每个函数传入的值都不一样
* setTimeout里面的函数是个闭包,它的外层函数的变量j,因为闭包缘故,没有被销毁,打印的时候可以取到它的值
*/
3.实现JS的模块
function CoolModule() {
var something = "cool";
var another = [1, 2, 3];
function doSomething() {
alert( something );
}
function doAnother() {
alert( another.join( " ! " ) );
}
return {
doSomething: doSomething,
doAnother: doAnother
};
}
var foo = CoolModule();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3
使用闭包的注意点:
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题