Javascript闭包例子
闭包的概念
内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。可理解为,闭包就是能够读取其他函数内部变量的函数。
表现形式是:定义在函数内部的函数。
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
Javascript闭包例子的更多相关文章
- javascript 闭包(转)
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- JavaScript 闭包整合
初遇闭包感觉很困惑,上网查看了些许介绍,有很多没看懂,就想先对能懂的东西整整 首先觉得要了解闭包,要先对一.JavaScript的变量作用域和作用域链有基本了解 1.变量的作用域分为:全局变量和局部变 ...
- 对于 Javascript 闭包理解
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- javascript闭包的理解
闭包是Javascript的一个难点,但也是一个很重要的知识点. 1.首先我们要知道变量作用域链 变量的作用域分两种:全局变量和局部变量.没有定义到任何函数中的变量为全局变量,在函数中定义的变量为局部 ...
- 深入理解javascript闭包(一)
原文转自脚本之家(http://www.jb51.net/article/24101.htm) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
- JavaScript“闭包”精解
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. 详细了解 Javascript语言的特殊之处,就在于函数内部可以直接读 ...
- javascript闭包和this对象
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- javascript 闭包学习
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- 《Web 前端面试指南》1、JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
随机推荐
- 实用技巧:利用Excel实现客户档案的统一管理
背景: 一个朋友新开了家门市,生意不错,客源旺盛. 有次我们喝茶时,他透露一个问题,就是客户的档案管理很不理想,都是纸面的,很容易丢失,也不方便查找. 我自诩混迹IT界多年,当然要替好友解决这个小麻烦 ...
- sql注入二
大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲: 第一讲:“纸上谈兵:我们需要在本地架设注入环境,构造注 ...
- FreeMarker之根据模型生成HTML代码
FreeMarker之根据模型生成HTML代码与FreeMarker根据模型生成Java代码,本质上是一样的,关于生成Java代码可以参考我的这篇文章:FreeMarker之根据模板生成Java代码 ...
- Linux tmux 使用指南
注意:本文内容适用于 Tmux 2.3 及以上的版本,但是绝大部分的特性低版本也都适用,鼠标支持.VI 模式.插件管理在低版本可能会与本文不兼容. Tmux 快捷键 & 速查表 启动新会话: ...
- 如何用javasript对Gridview的项目进行汇总统计?
当我们在gridview显示统计信息时,都会想在gridview最后一行显示[小计]结果,但gridview的话好像比较难搞(至少我也不会呀 囧~),那么我就结合jquery写了一个解决方案,下面举个 ...
- requireJS使用教程
一:为什么要使用requireJS? 很久之前,我们所有的JS文件写到一个js文件里面去进行加载,但是当业务越来越复杂的时候,需要分成多个JS文件进行加载,比如在页面中head内分别引入a.js,b. ...
- 【2017001】IList转DataTable、DataTable转IList
IList转DataTable.DataTable转IList using System; using System.Collections.Generic; using System.Compone ...
- 6.可见性关键字(volidate)
可见性关键字(volidate): 如果对java内存模型了解较清楚的话,我们知道每个线程都会被分配一个线程栈. 线程栈里存的是对象的引用,但当前cache缓存机制,可能会把数据拷贝. 就是,命中缓存 ...
- 大数据框架-HDFS
HDFS:分布式文件系统,运行文件通过网络在多台主机分享的文件系统,分块写入(128M),适用于一次写入多次查询,不支持并发写(只能一块一块写),小文件不合适. nameNode(主节点,单个): 保 ...
- Oracle中table数据数据类型
function F_ReturnDescription(varID in varchar2) return varchar2 is numDataCount ); mytable ly_family ...