您的位置:首页 > Web前端 > JavaScript

关于javascript中的闭包

2015-12-23 11:08 471 查看
闭包(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: