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 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
随机推荐
- PHP 生成全局唯一id
直接上代码: function generate_global_uniqid() { $prefix = md5(microtime(true)); // 生成唯一ID发生器 prefix,如果为服务 ...
- Kali-linux测试网络范围
测试网络范围内的IP地址或域名也是渗透测试的一个重要部分.通过测试网络范围内的IP地址或域名,确定是否有人入侵自己的网络中并损害系统.不少单位选择仅对局部IP基础架构进行渗透测试,但从现在的安全形势来 ...
- es6之类与对象
一.类的定义 class Parent{ constructor(name="mukewang"){ this.name=name; } } let v_parant=new Pa ...
- js 获取网页宽/高度
网页可见区域宽度: document.body.clientWidth 网页可见区域高度: document.body.clientHeight 网页可见区域宽度: document.body.off ...
- python-正则基础
正则表达式,说的简单些,就是一个匹配的功能,在python中,只要引用 re 模块,就能进行正则匹配操作 一.math匹配 先来看一个简单的例子 import re re.match(pattern, ...
- 让NSArray数组中每个对象都调用的方法
1. [array valueForKey:@"title"]; //Returns an array containing the results of invoking val ...
- 【Node.Js】npm国内被墙的解决方法
移动网就是坑,有VPN也上不去,真操蛋~先吐槽一下@中国移动 折腾了一晚上,总是报连接错误,导致我npm安装不上,查了半天资料,找到个靠谱的,粘贴过来备用. 原文地址:http://snoopyxdy ...
- Lua库-bit32库
Global = Global or {}; local bits = {}; function bits.bxor(num1,num2) local ret=bit32.bxor(num1,num2 ...
- java连接linux的三种方式(附执行命令)
# 本地调用使用JDK自带的RunTime类和Process类实现 public static void main(String[] args){ Process proc = RunTime.get ...
- Spring入门第一课:Spring基础与配置Bean
1.入门 Spring是简化java开发的一个框架,其中IoC和AOP是Spring的两个重要核心.由于Spring是非侵入性的,通过Ioc容器来管理bean的生命周期,还整合了许多其他的优秀框架,所 ...