Javascript闭包例子
2024-09-16 08:13:46
闭包的概念
内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。可理解为,闭包就是能够读取其他函数内部变量的函数。
表现形式是:定义在函数内部的函数。
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
最新文章
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
- 百度前端技术学院2015JavaScript基础部分-BOM
- [转载]TFS源代码管理
- soapui中文操作手册(三)----使用SoapUI进行负载测试
- day11_API第一天
- 菜鸟-手把手教你把Acegi应用到实际项目中(3)
- [译] Swift 的响应式编程
- cocos2d win7 安卓环境配置开发
- JS 事件与事件对象小结
- 通过try、except和else的使用来使Python程序更加“强壮”
- 国外.net学习资源网站
- [C++]Saving the Universe——Google Code Jam Qualification Round 2008
- LeetCode Database题解
- 201521123061 《Java程序设计》第十二周学习总结
- Windows Server 2016-DHCP服务器审核日志大小调整
- 唯一索引的一种使用情景【有则U无则I】
- vue--音乐播放器
- AOP 实现自定义注解
- CSAPP lab2 二进制拆弹 binary bombs phase_2
- HDU 1251 统计难题(字典树入门模板题 很重要)
热门文章
- eclipse run on server 时 报的错误APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
- Django 创建model的一些注意事项
- 调整home和根分区大小
- springmvc小结(上)
- Hive之数据类型
- 应对STM32 Cortex-M3 Hard Fault异常
- HTML5——前端预处理技术(Less、Sass、CoffeeScript)
- NAT和DHCP
- SSH整合(一)
- 开发机器上利用vs2013调试远程IIS上的c#程序