🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> 咕笛老师:闭包是必会的一个知识点,虽然在实际开发中不一定能用的上,但是这种思想一定要清楚的。很多插件和组件都是基于闭包开发的。 > **闭包函数:** 声明在一个函数中的函数,叫做闭包函数。 **闭包:** 内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。 函数`A`内部有一个函数`B`,函数`B`可以访问到函数`A`中的变量,那么函数`B`就是闭包 **闭包的实质:** 是因为函数嵌套而形成的作用域链 **闭包的作用:** 匿名自执行函数、缓存、实现封装(主要作用)、实现面向对象中的对象 **/\* 例子 0\*/** ~~~ var person = function(){ //变量作用域为函数内部,外部无法访问 var name = "default"; return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }(); print(person.name);//直接访问,结果为undefined print(person.getName()); person.setName("a"); print(person.getName()); //得到结果如下: undefined default a ~~~ **/\* 例子1 \*/** ~~~javascript function funA(){ var a = 10; // funA的活动对象之中; return function(){ //匿名函数的活动对象; alert(a); }} var b = funA(); b(); //10 ~~~ **/\* 例子2 \*/** ~~~javascript function outerFn(){ var i = 0; function innerFn() { i++; console.log(i); } return innerFn; } var inner = outerFn(); //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址 inner(); inner(); inner(); var inner2 = outerFn(); inner2(); inner2(); inner2(); //1 2 3 1 2 3 ~~~ **/\* 例子3 \*/** ~~~javascript var i = 0; function outerFn(){ function innnerFn(){ i++; console.log(i); } return innnerFn; } var inner1 = outerFn(); var inner2 = outerFn(); inner1(); inner2(); inner1(); inner2(); //1 2 3 4 ~~~