闭包的概念

内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。可理解为,闭包就是能够读取其他函数内部变量的函数。

表现形式是:定义在函数内部的函数。

  function f1(){
    var n=999;
    function f2(){
      alert(n); //
    }
  }

如上,f2函数可以访问到f1的局部变量n

反之则不行。我们无法获得内置函数的局部变量。

function add(num1){
return function(num2){
return num1+num2;
};
}
var num2 = add(4);
// 9
alert(num2(5));

闭包的作用

1. 使用匿名函数来隐藏全局作用域变量

这是一个自执行函数,对于msg变量,执行完立即释放。不污染全局对象。

(function(){
var msg = "Bye";
window.onload=function(){
alert(msg);
} })();

闭包的问题:闭包可以引用父函数中的变量,但提供的值并非该变量创建时的值,是在父函数范围内的最终值。最常见的问题是在for循环中

2. 绑定事件的例子

  1.通过数组给对象绑定多个事件
  2.obj.方法名 等价于 obj"方法名"]数组写法

(function(){
var obj = document.getElementById("main");
var items = ["click","mouseover"];
for(var i=0;i<items.length;i++){
(function(){
var item = items[i];
obj["on"+ item] = function(){
alert("you have "+item);
}
})()
}
})();

3. 结果缓存

有一个需求,每次执行变量值加1。在不使用全局变量的情况下我们可以使用闭包

function f1(){
var n = 1;
plusOne = function(){
n+=1;
alert(n);
}
return plusOne;
} f1();
plusOne(); // 2
plusOne(); // 3
// n is not defined
alert(n);

4. 封装, 模拟对象的私有方法

var person = function(){
//变量作用域为函数内部,外部无法访问
var name = "default"; return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}(); print(person.name);//直接访问,结果为undefined
print(person.getName());
person.setName("abruzzi");
print(person.getName());

再来个例子

var event = {};

(function(){
var add = function(){
return this.age+1;
}
event.add = add;
})();

event.age = 1;
var age = event.add();
alert(age)
// 出错
add()

上例中。add是局部方法,却可以通过全局对象event调用。防止暴露了内部方法。这样可以提高安全性。

参考:

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.2cto.com/kf/201410/342609.html

最新文章

  1. JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
  2. 百度前端技术学院2015JavaScript基础部分-BOM
  3. [转载]TFS源代码管理
  4. soapui中文操作手册(三)----使用SoapUI进行负载测试
  5. day11_API第一天
  6. 菜鸟-手把手教你把Acegi应用到实际项目中(3)
  7. [译] Swift 的响应式编程
  8. cocos2d win7 安卓环境配置开发
  9. JS 事件与事件对象小结
  10. 通过try、except和else的使用来使Python程序更加“强壮”
  11. 国外.net学习资源网站
  12. [C++]Saving the Universe——Google Code Jam Qualification Round 2008
  13. LeetCode Database题解
  14. 201521123061 《Java程序设计》第十二周学习总结
  15. Windows Server 2016-DHCP服务器审核日志大小调整
  16. 唯一索引的一种使用情景【有则U无则I】
  17. vue--音乐播放器
  18. AOP 实现自定义注解
  19. CSAPP lab2 二进制拆弹 binary bombs phase_2
  20. HDU 1251 统计难题(字典树入门模板题 很重要)

热门文章

  1. eclipse run on server 时 报的错误APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
  2. Django 创建model的一些注意事项
  3. 调整home和根分区大小
  4. springmvc小结(上)
  5. Hive之数据类型
  6. 应对STM32 Cortex-M3 Hard Fault异常
  7. HTML5——前端预处理技术(Less、Sass、CoffeeScript)
  8. NAT和DHCP
  9. SSH整合(一)
  10. 开发机器上利用vs2013调试远程IIS上的c#程序