(一) 闭包是什么, 闭包形成的原因
闭包的概念:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包最常用的方式就是在一个函数内部创建另一个函数(函数中的函数)。
简单概括: 闭包就是一个能访问另外一个函数内部变量的函数
闭包形成的原因:函数内部的局部变量一般在函数运行结束的时候就会被销毁, 但如果局部变量因为被外部引用而导致没有被销毁, 就形成了闭包
(二) 闭包有哪些作用
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(); // coolfoo.doAnother(); // 1 ! 2 ! 3
使用闭包的注意点:
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题
