Javascript闭包使用场景原理详细_第1页
Javascript闭包使用场景原理详细_第2页
Javascript闭包使用场景原理详细_第3页
Javascript闭包使用场景原理详细_第4页
Javascript闭包使用场景原理详细_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论