预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://zhuxue-feng.javaeye.com/blog/180252"理解javascriptclosures闭包(读书笔记) 关键字:javascript 什么是闭包(closures):闭包就是内部函数通过某种方式使其可见范围超出了其定义的范围,这就产生了一个在其定义范围内的闭包.这是我理解后的一个定义,呵呵!很晦涩吧!不过没关系,可以先看看下面的讲解.一内部函数(innerfunction)javascript是支持内部函数申明(innerfunctiondeclaration)的编程语言,内部函数就是在另一个函数的内部定义,如functionouterFun(){functioninnerFun(){alert('hello');}}函数innerFun就是内部函数,它在函数outerFun范围内是可见的,也就是说innerFun函数的命名空间(namespace)是在outerFun范围之内.正确调用:functionouterFun(){functioninnerFun(){alert('hello');}innerFun();}outerFun();//alerts"hello"错误调用(error):functionouterFun(){functioninnerFun(){alert('hello');}}innerFun();那么如果我想在函数outerFun外面调用函数innerFun,我该如何做呢?做法1:varglobVar;functionouterFun(){functioninnerFun(){alert('hello');}globVar=innerFun;}outerFun();globVar();做法2:functionouterFun(){functioninnerFun(){alert('hello');}returninnerFun;}varglobVar=outerFun();globVar();做法3:functionouterFun(){functioninnerFun(){alert('hello');}return{'innerFun':innerFun};}varglobVar=outerFun();globVar.innerFun();以上三种做法把内部函数的可见范围扩大了,其中最后一种做法是把内部函数当做匿名对象{'innerFun':innerFun}的属性,并随之一起返回.从中看到在javascript里面,函数名称可以当作是一种引用变量,类似于c里面指针的概念,在这里,随着程序的执行会产生两个引用变量指向内部函数innerFun,一个是globVar(第三种做法是globVar.innerFun),另一个是其函数自身innerFun,只不过这两个变量的可见范围不一样,即命名空间不一样.javascript垃圾回收器会在函数最后一个引用变量被废弃后,释放其所占用的内存.二变量范围例1内部函数变量在内部函数内申明的变量其可见范围就在其函数内functionouterFun(){functioninnerFun(){varinnerVar=0;innerVar++;alert(innerVar);}returninnerFun;}varglobVar=outerFun();globVar();//Alerts"1"globVar();//Alerts"1"varinnerVar2=outerFun();innerVar2();//Alerts"1"innerVar2();//Alerts"1"每一次内部函数调用,一个新的innerVar变量都被创建,所以结果显示都是1例2内部函数引用全局变量(globalvariables)varglobVar=0;functionouterFun(){functioninnerFun(){globVar++;alert(globVar);}returninnerFun;}varglobVar=outerFun();globVar();//Alerts"1"globVar();//Alerts"2"varglobVar2=outerFun();globVar2();//Alerts"3"globVar2();//Alerts"4"每一次内部函数的调用,全局变量都增加1,所以显示结果都是依次递增.例3内部函数引用外部函数变量functionouterFun(){varouterVar=0;functioninnerFun(){outerVar++;alert(outerVar);}returninnerFun;}varglobVar=outerFun();globVar();//Alerts"1