版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Javascript闭包使用场景原理详细Javascript中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部变量的函数。
比如下面的代码:
functionf1(){
varn=999;
functionf2(){
console.log(n);
returnf2;
varresult=f1();
result();//999
函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。
这就是Javascript语言特有的链式作用域结构(chainscope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,就可以在f1外部读取它的内部变量了。
二、闭包的使用场景
1.setTimeout
原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。
functionf1(a){
functionf2(){
console.log(a);
returnf2;
varfun=f1(1);
setTimeout(fun,1000);//一秒之后打印出1
定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。
比如下面这段代码:
!DOCTYPEhtml
htmllang=en
head
metacharset=UTF-8
title测试/title
/head
body
ahref=#rel=externalnofollowrel=externalnofollowrel=externalnofollowid=size-1212/a
ahref=#rel=externalnofollowrel=externalnofollowrel=externalnofollowid=size-2020/a
ahref=#rel=externalnofollowrel=externalnofollowrel=externalnofollowid=size-3030/a
scripttype=text/javascript
functionchangeSize(size){
returnfunction(){
document.body.style.fontSize=size+px
varsize12=changeSize(12);
varsize14=changeSize(20);
varsize16=changeSize(30);
document.getElementById(size-12).onclick=size12;
document.getElementById(size-20).onclick=size14;
document.getElementById(size-30).onclick=size16;
/script
/body
/html
当点击数字时,字体也会变成相应的大小。
3.函数防抖
在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
实现的关键就在于setTimeOut这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现。
如下代码所示:
*fn[function]需要防抖的函数
*delay[number]毫秒,防抖期限值
functiondebounce(fn,delay){
lettimer=null
//借助闭包
returnfunction(){
if(timer){
clearTimeout(timer)//进入该分支语句,说明当前正在一个计时过程中,并且又触发了相同事件。所以要取消当前的计时,重新开始计时
timer=setTimeOut(fn,delay)
}else{
timer=setTimeOut(fn,delay)//进入该分支说明当前并没有在计时,那么就开始一个计时
4.封装私有变量
如下面代码:用js创建一个计数器
方法1:
functionf1(){
varsum=0;
varobj={
inc:function(){
sum++;
returnsum;
returnobj;
letresult=f1();
console.log(result.inc());//1
console.log(result.inc());//2
console.log(result.inc());//3
在返回的对象中,实现了一个闭包,该闭包携带了局部变量x,并且,从外部代码根本无法访问到变量x。
方法2:
functionf1(){
varsum=0;
functionf2(){
sum++;
returnf2;
f2.valueOf=function(){
returnsum;
f2.toString=funct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字孪生能源工程师考试试卷及答案
- 设施农业温室大棚设计师岗位招聘考试试卷及答案
- 氢能储运装备研发工程师考试试卷及答案
- 竞业限制协议书多久要签
- 储备粮合作协议书模板
- 跨境电商协议
- 鱼池退出保护区协议书
- 宝宝认知蔬菜课程设计
- 军休所中医馆服务协议书
- 子公司框架协议书英文缩写
- 2024秋九年级化学上册 4.3 水的组成说课稿 (新版)新人教版
- 绿化保洁安全培训课件
- 疑难病例讨论制度
- 人工流产并发症
- 2025年四川省广安市中考物理试题(原卷版)
- 2025年安徽省高考化学试卷真题(含答案详解)
- 设备安装、调试、验收管理制度
- 2024年贵州省高考化学试题含答案解析
- 2025年能源控股集团所属辽宁铁法能源有限责任公司招聘笔试参考题库附带答案详解
- 2025-2030年中国核桃种植深加工行业竞争格局与前景发展策略分析报告
- 2025年高考英语完形填空+语法填空专练(原卷版+解析版)
评论
0/150
提交评论