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个5for (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(); // coolfoo.doAnother(); // 1 ! 2 ! 3
使用闭包的注意点:
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题
