javascript-原生-闭包
1.变量的作用域
前提:这里只全部都通过var创建的变量或对象
1.全局变量:函数外创建变量
var x=10;
function test(){
alert("全局变量在test函数中"+x);
function a(){
alert("全局变量在私有函数中"+x);
}
a();
}
2.局部变量:函数内部创建变量。
var x=10;
function test(){
var y=20;
alert("全局变量在test函数中"+x);//10
alert("局部变量在test函数中"+y);//20
alert("局部变量在test函数中"+z);//报错,z未定义
function a(){
var z=30;
alert("局部变量早函数a中"+z);//30
}
}
注:x书全部变量在整个作用域有效
y是局部变量在test函数中有效,在a函数外无效
z是局部变量只在a函数中有效
但是:如果我们想在函数外使用函数的变量怎么办?
这时候就产生了一个东西,闭包。
闭包的概念:是指有权访问另一个函数作用域中的变量的函数。
创建闭包的方式,就是在一个函数内部创建另一个内部(私有)函数。
下面是闭包的实例:
1.
function test(){
var x=10;
return function(){
return x;
}
}
alert(x);//调用局部变量x,报错未定义
//调用
var a=test();
alert(a());
说明:a实际上就是闭包匿名函数,函数test中的局部变量x一直保存在内存中,并没有在test调用后被自动清除。
2.
var y;
function test(){
var x=10;
y=function(){
return x;
}
}
//调用函数
test();//undefined
//调用
alert(y());//10
3.
function test(arg){
var y=function(){
return arg;
}
arg++;
return y;
}
var a=test(123);//undefined
alert(a());//124
4.
function test(){
var x=[];
var i;
for(i=0;i<3;i++){
x[i]=function(){
return i;
}
}
return x;
}
var a=test();//undefined
alert(a[0]());//3
alert(a[1]());//3
alert(a[2]());//3
说明:输出结果都是3,因为循环完毕i的值为3,三个函数都是指向这一个共同的值,
那么如何解决这个问题呢?下面我们来看。
解决方案一:使用自调函数来实现
function test(){
var x=[];
var i;
for(i=0;i<3;i++){
x[i]=(function(a){
return function(){
return a;
}
})(i);
}
return x;
}
var a=test();//undefined
alert(a[0]());//0
alert(a[1]());//1
alert(a[2]());//2
方案二:不使用自调函数来实现
function test(){
function makeClosure(x){
return function(){
return x;
}
}
var a=[];
var i;
for(i=0;i<3;i++){
a[i]=makeClosure(i);
}
return a;
}
var b=test();//undefined
alert(b[0]());//0
alert(b[1]());//1
alert(b[2]());//2
闭包应用实例--Getter与Setter
var getValue,setValue;
(function(){
var secret=0;
getValue=function(){
return secret;
};
setValue=function(v){
secret=v;
}
})()
alert(getValue())//查看内部变量值
setValue(3)//设置内部局部变量的值
alert(getValue());
迭代器实例
function setup(x){
var i=0;
return function(){
return x[i++];
}
}
var next=setup(["a","b","c"]);//undefined
alert(next());//a
alert(next());//b
alert(next());//c
javascript-原生-闭包的更多相关文章
- jQuery? 回归JavaScript原生API
如今技术日新月异,各类框架库也是层次不穷.即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势.但JS原生API写法依旧:并且 ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展
在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...
- JavaScript作用域闭包简述
JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...
- JavaScript的闭包原理
什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...
- Js(javaScript)的闭包原理
问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 小编 ...
- 深入理解javascript的闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- JavaScript原生折叠扩展收缩菜单带缓冲动画
JavaScript原生折叠扩展收缩菜单带缓冲动画 @落雨 <div id="div_two" style="display: none;"> &l ...
- 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- javascript,jquery(闭包概念)(转)
偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...
随机推荐
- QT学习日记篇-02-QT信号和槽
课程大纲: <1>给控件改名字 随着UI界面的控件变多,如果使用系统自带的名称,后期会让人不明觉厉,说白了,就是掌握C++的命名规则:易懂,条例清晰,人性化 方法:直接点击控件,进入右侧对 ...
- 浅谈可持久化Trie与线段树的原理以及实现(带图)
浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...
- SpringBoot整合定时任务----Scheduled注解实现(一个注解全解决)
一.使用场景 定时任务在开发中还是比较常见的,比如:定时发送邮件,定时发送信息,定时更新资源,定时更新数据等等... 二.准备工作 在Spring Boot程序中不需要引入其他Maven依赖 (因为s ...
- RabbitMQ之消息模式1
消息100%的投递 消息如何保障100%的投递成功? 什么是生产端的可靠性投递? 保障消息的成功发出 保障MQ节点的成功接收 发送端收到MQ节点(Broker)确认应答 完善的消息进行补偿机制 BAT ...
- NOIP模拟21:「Median·Game·Park」
T1:Median 线性筛+桶+随机化(??什么鬼?). 首先,题解一句话秀到了我: 考虑输入如此诡异,其实可以看作随机数据 随机数据?? 这就意味着分布均匀.. 又考虑到w< ...
- RT-Thread 4.0 + STM32F407 学习笔记1
RT Thread 4.0提供了新的BSP框架 新 BSP 框架的主要特性如下: 提供多系列 BSP 模板,大大降低新 BSP 的添加难度: 每个 BSP 都配有齐全的驱动文件,开发者可以方便地使用所 ...
- MongoDB 常见问题 - 解决 brew services list 查看 MongoDB 服务 status 显示 error 的问题
问题背景 将 MongoDB 作为服务运行 brew services start mongodb-community@4.4 也显示运行成功了,但是查看服务列表的时候,发现 MongoDB 服务的还 ...
- Nginx优化与防盗链
目录: 一.隐藏版本号 二.修改用户与组 三.缓存时间 四.日志切割 五.连接超时 六.更改进程数 七.配置网页压缩 一.隐藏版本号 可以使用 Fiddler 工具抓取数据包,查看 Nginx版本 也 ...
- 使用Redis实现分布式会话
1. 概述 传统的单体应用中,用户是否登录,通常是通过从Tomcat容器的session中获取登录用户信息判断的. 但在分布式的应用中,通常负载均衡了多台Tomcat,每台Tomcat都有自己独立的s ...
- CodeForce-762B USB vs. PS/2(贪心)
USB vs. PS/2 CodeForces - 762B 题意:有三种电脑,分别有a.b.c个,第一种只有USB接口,第二种只有PS/2接口,第三种有两种接口,有m个鼠标,告诉你价钱和接口类型,问 ...