首页 > 编程语言 > 详细

关于javascript中的闭包

时间:2015-12-23 12:22:29      阅读:247      评论:0      收藏:0      [点我收藏+]

闭包(closure)是javascript语言的一个难点,对于初学者的我也算是花很多时间去理解,

以下是我的笔记,目前所理解的闭包如下,如有不对,望指正,再此感谢!

 

闭包有三特性:

1.函数嵌套函数。

2.函数内部可引用外部变量和参数。

3.参数和变量不会被垃圾回收机制所收回。

 

闭包的好处:

1、希望一个变量长期驻扎在内存中。

2.避免全局变量的污染。

3.私有成员的存在。

 

用法:
1.模块化代码。
2.在循环中直接找到对应元素的索引。
 
闭包的概念:
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我觉得阮一峰的理解着实很好,闭包就是能够读取其他函数内部变量的函数。

 

先说说js中的作用域

  1.全局
          函数外申明
          作用范围:整个全局作用域下都可见
  2.局部(函数)
          函数内申明
          作用范围:只有在该函数内部可见,函数外是不能访问的
         
注: 当一个变量没有使用var来申明的时候,这个变量就是全局的。
 
javascript语言的特殊之处:内部函数可以访问外部变量、参数,但是外部函数无法访问内部函数的变量和参数。各种原因外部函数需要访问内部变量,所以办法就是在函数内部在定义一个函数,再把函数内部定义的这个函数通过返回值,这样就可以得取这个内部函数的变量和参数。【创建闭包最常见的方式就是在一个函数内部创建另一个函数,通过这个函数访问这个函数的局部变量。】
 
function f1(){

    var n=999;

    function f2(){
      alert(n); 
    }

    return f2;

  }

  var result=f1();

  result(); // 999

  

 

注意事项:
在IE下可能会引发内存泄露。(当页面跳转,变量不会释放。一直存在内存中,使CPU一直累加,只有关闭浏览器才会释放内存)
满足内存释放的条件为:当一个变量,这个变量dom节点或者一个属性去引用内部函数,内部对象又去引用外部,这样互相引用就会出现内存泄露的问题。
 
解决方法:
1.在页面出来 onunload 的时候,把事件取消。(onunload 事件在用户退出页面时发生。)
2.在外部建一个变量,引用,在内部调用。之后再在外部把对象为空。
function closure(){
    var oDiv = document.getElementById(‘oDiv‘);//oDiv用完之后一直驻留在内存中
    oDiv.onclick = function () {
        alert(‘oDiv.innerHTML‘);//这里用oDiv导致内存泄露
    };
}
closure();
//最后应将oDiv解除引用来避免内存泄露
function closure(){
    var oDiv = document.getElementById(‘oDiv‘);
    var test = oDiv.innerHTML;
    oDiv.onclick = function () {
        alert(test);
    };
    oDiv = null;
}

 

关于javascript中的闭包

原文:http://www.cnblogs.com/tritri/p/5069257.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!