闭包 :
函数定义时,保存其作用域中的变量
利用函数作用域的特性,函数内部可以访问函数外部(上一层作用域)的变量
闭包的意义:
在于 在非函数创建的位置,访问函数创建位置的变量
闭包的作用:
1.变量的声明周期 (延长局部变量的生命周期)
2.变量的作用域 (封装私有变量)
作用域的注意点:
1.每个函数都有自身的this ,arguments,无法访问外层函数作用域中的。
2. 闭包函数执行时,参数或局部变量会覆盖闭包引用的变量
3.闭包引用变量时,保存的是引用。 引用的值(基本类型)可能在外部发生变化,如果需要将变量的值作为常量,需要将 引用转化为值时, 利用 call-by-shall 特性
思路:引用——》传入自执行匿名函数——>传参特性——》值
闭包与对象的比较
层叠
1.闭包: 在过程中以环境的形式包含了数据
2.对象: 以方法的形式包含了过程
面向对象与函数式比较: 一个以数据为中心 一个以函数为中心 一个用数据包含函数 一个以函数的形式包裹数据
一般对象中只含有一个方法,就闭包替代比较合适。 有多个方法时,用面向对象组织代码结构比较合适
面向对象可以实现的功能,函数式也可以实现。只是实现的角度的不同
性能比较:
闭包:实例化速度慢,调用速度快
对象:实例化速度快,调用速度慢
******************************************************************************************************************
对闭包的误解:当需要延长一个变量的生命周期时,使用闭包,不应该被认为是浪费内存。其他方式也是讲变量保存在内存中
闭包和内存泄露
IE bug:循环引用, 引用计数策略无正确处理循环引用。
1.两个对象相互引用
2.DOM事件处理函数引用了DOM节点(也是循环引用)
function foo(element, a, b) {
element.onclick=function(){/*usesaandb*/};
}
解决方法:
function foo(element, a, b) {
element.onclick=bar(a,b);
}
functionbar(a,b){
returnfunction(){/*usesaandb*/}
}
优质内容筛选与推荐>>
1、(二)进阶练习____2、执行网络操作——管理网络的使用情况-Managing Network Usage2、我的公司培训讲义(2):设计模式思想精要教程3、【转】【Android】Gridview出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法4、九度OJ 1019:简单计算器 (基础题、DP)5、[华为机试练习题]35.找零钱