关于闭包
程序员文章站
2022-12-19 20:52:19
全局变量和局部变量 1 var a=1; //全局变量 2 function fun() { 3 var a=2; //局部变量 4 b=1; //全局变量 5 alert(a); //2 6 } 7 alert(a); //1 8 alert(b); //1 JS中函数内是可以直接读取全局变量,而 ......
全局变量和局部变量
1 var a=1; //全局变量 2 function fun() { 3 var a=2; //局部变量 4 b=1; //全局变量 5 alert(a); //2 6 } 7 alert(a); //1 8 alert(b); //1
JS中函数内是可以直接读取全局变量,而函数外部是无法读取函数内的局部变量的
闭包
闭包就是能读取另一个函数内部变量的函数,可以简单的理解为定义在一个函数内部的函数
本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁
1 function f1(){ 2 var n=1; 3 function f2(){ 4 alert(n); 5 } 6 return f2; 7 } 8 //alert(n); 9 var result=f1(); 10 result(); // 1
js语言的“链式作用域”,子对象会一级一级的向上寻找所有父对象的变量,所以,父对象的所有变量对子对象都是可见的。因为f2可以读取f1中的局部变量,所以只要把f2作为返回值就可以在f1外部读取它的内部变量。
闭包的用途
1、读取函数内部的变量
2、让这些变量的值始终保持在内存中
1 function f1(){ 2 var n=1; 3 Add=function(){ 4 n+=1; 5 }; 6 function f2(){ 7 alert(n); 8 } 9 return f2; 10 } 11 //alert(n); 12 var result=f1(); 13 result(); // 1 14 Add(); 15 result(); // 2
result实际就是闭包函数f2,一共被执行了两次。第一次是1,第二次是2 。这说明局部变量n一直都在内存里,因为f1是f2的父函数,f2被赋值给一个全局变量,这导致f2始终都在内存中,而f2的存在依赖f1,因此f1也始终都在内存中。
问题
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗会很大,所以不能滥用闭包,否则会造成网页的性能问题,在退出函数之前将不使用的局部变量全部删除。
2、闭包会在父函数外部改变父函数内部变量的值,所以如果把父函数当做对象来使用,把闭包当做它的公用方法,把内部变量当作它的私有属相,这时不能随便改变父函数内变量的值。