JavaScript闭包
一:Js变量的作用域
全局变量:
1 <script type="text/javascript"> 2 var a=22;//全局变量 3 function func(){ 4 alert(a); 5 } 6 func(); 7 </script>
局部变量
1 <script type="text/javascript"> 2 function func(){ 3 var a=22; 4 } 5 func(); 6 alert(a); 7 </script>
局部变量不可以直接读取!
二:从外部读取方法内部的局部变量(使用闭包!)
1 <script type="text/javascript"> 2 function func(){ 3 var a=22; 4 function func2(){ 5 alert(a); 6 } 7 return func2(); 8 } 9 var result=func; 10 result(); 11 </script>
三:闭包的概念
各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。实际上,闭包就是能够读取其他函数内部变量的函数。
由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
所以本质上,闭包就是将函数内部和函数外部连接在一起的一座桥梁。
四:闭包的用途
一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
五:闭包的使用注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中肯能会导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值,所以如果你把父函数当做对象使用,把闭包当做他的公用方法(Public Method),把内部变量当做它的私有属性(Private value),这时候一定要小心,不要随便改变父函数内部变量的值。
1 <script type="text/javascript"> 2 var name="The window"; 3 var object={ 4 name:"My object", 5 getNameFunc:function(){ 6 return function(){ 7 return this.name; 8 }; 9 } 10 }; 11 alert(object.name); 12 alert(object.getNameFunc()()); 13 </script>