1、什么是闭包
闭包就是有权访问另一个函数作用域中的变量的函数
2、闭包形成的原因
函数内部的局部变量一般在函数运行结束的时候就会被销毁, 但如果局部变量因为被外部引用而导致没有被销毁, 就形成了闭包
3、闭包有哪些作用
3-1 封装私有变量
function getCat() {
var name = '白猫';
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
}
}
var cat = getCat();
console.log(cat);//返回的是一个对象
cat.setName('黑猫')
console.log(cat.getName());
私有变量(私有属性)是后台语言经常用的东西,意思是这个属性是私有的,不能随意更改,要改,必须通过指定的set和get方法进行获取和修改.
3-2 模仿块级作用域(ES5中没有块级作用域)
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, i * 100);
}
//结果打印了5个5
for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j);
}, j * 100);
})(i);
}
/*
* 上面的代码,循环了10次,创建了10个函数,每个函数传入的值都不一样
* setTimeout里面的函数是个闭包,它的外层函数的变量j,因为闭包缘故,没有被销毁,打印的时候可以取到它的值
*/
3-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
使用闭包的注意点:
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题