闭包是什么?

·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立;所以都可以访问全局变量

·为了解决函数外部无法访问函数内局部变量的问题,就在父函数中定义一个子函数并让它访问了父函数的局部变量,再通过父函数返回该子函数就实现了调用局部变量的效果;

·而上面中的子函数就是闭包,所以闭包的定义是“能够读取其他函数内部变量的函数”,其实简单理解就是“一个定义在函数中的函数”;

示例

  function parent(){
var a=,b=;
function child(){
console.log(a+b);
}
return child;
}
var func1=parent(); //这是将子函数返回给变量
func1();

使用闭包有什么好处?

在内存中维持一个变量,由于闭包,f1中的n只有通过f2方法访问到,无法通过其他途径访问修改,从而达到了保护变量安全的效果;通过闭包实现了js私有属性和私有方法的效果;

function f1(){

//闭包f2被外引用始终存在内存中,而它所依赖的f1也会始终存在

//所以n,m都是始终存在,删除闭包直接f1=null;

n=1,m=100;

madd=function(){

m+=10;

alert(m);

}  //全局变量madd

function f2(){

n+=1;

alert(n);

}

return f2;

}

var a=f1(); //将子函数返回赋值给了变量a

a();

madd();

//madd的值是一个匿名函数,同时是一个闭包,实现了外部对函数内部进行操作

a();

使用闭包的注意点:

·闭包会使函数中的变量一直存在内存上会导致内存消耗过大,所以不能滥用闭包,否则会造成网页性能问题,IE可能会造成内存溢出。最好的方式是在退出闭包前将不必要的局部变量删除。

·JavaScript垃圾回收机制,如果一个对象不再被引用,那么这个对象就会被GC回收,如果两个对象相互引用,而不再被第三方引用,那么这两个对象会被GC回收,上述父函数被子函数引用,子函数又被外部c引用,这就是父函数不被回收的原因;

·作用域链时为了保证在执行环境中有权访问的变量和方法是有序的,只能向上访问,到window终止,即作用域链向下访问是不被允许的;

最新文章

  1. js报错: Uncaught RangeError: Invalid string length
  2. HDU 1005 F(Contest #1)
  3. hdu 2087
  4. python简单粗暴多进程之concurrent.futures
  5. 如何避免JSP页面自动生成session对象?为什么要这么做?
  6. ASP.NET中MEMCACHED
  7. xcode7.3 iTunes Store operation failed问题
  8. aix网络管理
  9. 小小白的python之路------python基础01
  10. MySQL .msi 安装失败改用.zip安装步骤
  11. js中常用的方法(数组篇)
  12. python中线程和进程(一)
  13. OSGI target环境配置过程
  14. elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
  15. 检测cpu、主板、内存
  16. java中经常使用的Swing组件总结
  17. js便签笔记(8)——js加载XML字符串或文件
  18. mariadb启动报错:[ERROR] Can't start server : Bind on unix socket: Permission denied
  19. T-SQL语句3
  20. java 图片与文字生成PDF

热门文章

  1. PyTorch Tutorials 1 PyTorch是什么?
  2. 使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转
  3. 数据分析 - Power BI 链接 mysql 数据分析
  4. Windows 10 搭建Python3 安装使用 protobuf
  5. java字符串MD5加密后再转16进制
  6. 【c++基础】C++编写Config类读取配置文件
  7. Flutter 贝塞尔曲线切割
  8. C++中使用OPENCV对深度学习的特征图进行可视化
  9. 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速
  10. java中序列化的作用