ZYXS

生命不息,代码不止!
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>

 

posted on 2018-11-22 15:31  ZYXS  阅读(158)  评论(0编辑  收藏  举报