关于javascript中的闭包
2015-12-23 11:08
471 查看
闭包(closure)是javascript语言的一个难点,对于初学者的我也算是花很多时间去理解,
以下是我的笔记,目前所理解的闭包如下,如有不对,望指正,再此感谢!
闭包有三特性:
1.函数嵌套函数。
2.函数内部可引用外部变量和参数。
3.参数和变量不会被垃圾回收机制所收回。
闭包的好处:
1、希望一个变量长期驻扎在内存中。
2.避免全局变量的污染。
3.私有成员的存在。
用法:
1.模块化代码。
2.在循环中直接找到对应元素的索引。
闭包的概念:
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我觉得阮一峰的理解着实很好,闭包就是能够读取其他函数内部变量的函数。
先说说js中的作用域
1.全局
函数外申明
作用范围:整个全局作用域下都可见
2.局部(函数)
函数内申明
作用范围:只有在该函数内部可见,函数外是不能访问的
注: 当一个变量没有使用var来申明的时候,这个变量就是全局的。
javascript语言的特殊之处:内部函数可以访问外部变量、参数,但是外部函数无法访问内部函数的变量和参数。各种原因外部函数需要访问内部变量,所以办法就是在函数内部在定义一个函数,再把函数内部定义的这个函数通过返回值,这样就可以得取这个内部函数的变量和参数。【创建闭包最常见的方式就是在一个函数内部创建另一个函数,通过这个函数访问这个函数的局部变量。】
注意事项:
在IE下可能会引发内存泄露。(当页面跳转,变量不会释放。一直存在内存中,使CPU一直累加,只有关闭浏览器才会释放内存)
满足内存释放的条件为:当一个变量,这个变量dom节点或者一个属性去引用内部函数,内部对象又去引用外部,这样互相引用就会出现内存泄露的问题。
解决方法:
1.在页面出来 onunload 的时候,把事件取消。(onunload 事件在用户退出页面时发生。)
2.在外部建一个变量,引用,在内部调用。之后再在外部把对象为空。
以下是我的笔记,目前所理解的闭包如下,如有不对,望指正,再此感谢!
闭包有三特性:
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 编码规范
- Javascript学习笔记1 javascript的特点
- 详解JavaScript时间格式化
- Jsoup学习第二课(实例解析)
- 【JavaScript 高级程序设计阅读笔记】JSON
- 如何用js得到当前页面的url信息方…
- js中cookie的使用详细分析
- JS+JQ简单的表单失焦验证
- js实现客服
- js截图
- javascript 得noscript标签
- js浮点数精度问题(js计算中遇到的坑)
- javascript script标签
- js 数组
- Matching Game based on JS
- 关于设置元素居中的一些问题
- js实现md5加密sha1加密等
- ARM平台移植 json-c-0.12
- Console命令详解,让调试js代码变得更简单
- hammer.js