杂七杂八JS : 浅谈闭包一
来源:互联网 发布:aspx php混合网站 编辑:程序博客网 时间:2024/05/22 00:41
基础概念
闭包是指有权访问另一个函数作用域的变量的函数。创建闭包的的常用方式,就是一个函数内部创建另一个函数。闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等。
一般来说,函数内部可以访问函数外部的全局变量,
var a = 1;//全局变量 function f1(){ alert(a); } f1();//1
函数外部不能访问函数内部的局部变量,
function f2(){ var a = 1 ; //局部变量 } alert(a); //error
注意,在函数内部定义变量时,要加上var,否则该变量就是全局变量了
function f3(){ a = 1 ; //全局变量 } alert(a); //1
但是,有时候我们想得到函数内部的局部变量,那应该如何实现呢?这就引入了闭包的概念。
function f1(){ var n =1; return function(){ alert(n) }; } var result = f1(); result();//1
闭包的作用
1:读取函数内部的变量
就如上面闭包的例子,可以在函数外部读取函数内部的变量。
2:将变量的值始终保存在内存中
一般来讲,当函数执行完毕之后,函数内部的局部活动对象就会被销毁,内存中仅保存全局作用域,即js的内存回收机制。
如果这个函数内部又嵌套了另一个函数,而这个函数是有可能在外部被调用到的.并且这个内部函数又使用了外部函数的某些变量的话.这种内存回收机制就会出现问题。如果在外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到他所需要的外部函数中变量的值了.所以js解释器在遇到函数定义的时候,会自动把函数和他可能使用的变量(包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来.也就是构建一个闭包,这些变量将不会被内存回收器所回收,只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收。
注意事项
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
参考网址:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://www.cnblogs.com/mzwr1982/archive/2012/05/20/2509295.html
1 0
- 杂七杂八JS : 浅谈闭包一
- 杂七杂八js
- JS杂七杂八
- 杂七杂八 - 浅谈ACM
- js/jquery 杂七杂八
- js杂七杂八细节--运算符
- 杂七杂八js(高级篇)
- 杂七杂八JS :使用this对象
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- 杂七杂八
- Python通过paramiko远程下载Linux服务器上的文件
- leetcode 438. Find All Anagrams in a String
- 访问网络工具类
- python 中 print 函数用法总结
- Robot Framework完整流程学习系列一
- 杂七杂八JS : 浅谈闭包一
- 设计模式深入学习-单例模式
- 原创:微信小程序java实现AES解密并获取unionId
- c++子类和父类成员函数重名
- 算法复杂度速查表
- WDCP安装memcache、mysqli、PDO_MYSQL、mysql innodb、libmc
- 线性代数之从线性方程组看线性组合
- 放弃WebView,使用Crosswalk做富文本编辑器
- 设计模式深入学习--Strategy 策略模式(行为型模式)