闭包:一个函数oneF里return了另一个函数innerF,然后在oneF外面运行了函数innerF,如果innerF里有用到在oneF里定义的变量,则此时依然可以引用到,

但是变量值不是定义函数innerF那时变量的值,而是运行函数innerF时变量的值(此时很可能由于已经运行了函数oneF而导致变量值与定义函数innerF时变量的值不同)。

function oneF(){
var arr=[];
for(var i=0;i<3;i++){
arr[i]=function(){alert(i);};
}
return arr;
}
oneF()[0](); //3而不是0

若要改成0,可以在定义函数后立即执行就能把i的值保存下来了:

示例2:

function oneF(){
var arr=[];
for(var i=0;i<3;i++){
arr[i]=(function(pi){
return function(){alert(pi);}
})(i); //立即一个匿名自执行函数来返回存入arr的函数
}
return arr;
}
oneF()[0](); //

用途:

1:匿名自执行函数就是闭包机制的应用,如上例中arr[i]=function(){alert(pi);},这里的pi就是调用了父函数的参数pi。

2:可以使变量一直保存在内存里,适用于需要保存变量的值提供给下次使用,如累积结果或保存第一次的计算值,第二次就可以直接使用了。

function oneF(){
var a=0;
function innerF(){a=a+10;alert(a);}
return innerF;
}
var f=oneF();
f();//
f();//

想一想下面的例子(结合示例2):

function oneF(){
var a=0;
function innerF(){a=a+10;alert(a);}
return innerF;
}
oneF()(); //
oneF()(); //??

注意闭包函数的执行环境:

var name='global name';
var obj={
name:'local name',
f:function(){return function(){alert(this.name);}}
};
obj.f()();

结果是’global name',原因是function(){alert(this.name)}这个函数在实际运行时是在全局环境里运行的。

保存缓存:

var obj={
a:'default',
oneF:function(){
var that=this;
return function(){
if(that.a!=='default'){alert('第一次运行以后:'+that.a);}
else{ //一连串复杂运算后得出a的值
that.a=8;
alert('第一次运行:'+that.a);
}
}
}
};
var f=obj.oneF();
f(); //第一次运行:8
f(); //第一次运行以后:8

关于js闭包杂记的更多相关文章

  1. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  2. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  3. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  4. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  5. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  6. js闭包理解

    js闭包的作用是使函数外可以访问函数内部的变量,是通过 在函数内部 定义 访问函数内变量 的函数实现的,内部的一个函数产生一个闭包 function a() { var i=0; return fun ...

  7. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  8. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

  9. js闭包和ie内存泄露原理

    也议 js闭包和ie内存泄露原理 可以, 但小心使用. 闭包也许是 JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档. 有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给 ...

随机推荐

  1. 自己的缺省(sheng)源

    write无力吐槽了 #include <cstdio> #include <iostream> #include <algorithm> #include < ...

  2. Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126

    本文转自:http://www.cnblogs.com/yuerdongni/archive/2012/08/18/2645140.html 在使用SQL2005(或2008)是可能会遇到错误提示: ...

  3. tinyxml开源库的基本用法

    最近项目中的某个功能需要写xml,由于项目中已经引入了tinyxml,所以不再寻找其他开源库. 前提:你得有个xml对象,声明tinyxml的对象:基于tinyxml的内存管理,TiXmlDocume ...

  4. Java---IO加强(3)-IO流的操作规律

    一般写关于操作文件的读取的几个通用步骤!!! 1.明确源和目的. 源:InputStream Reader 一定是被读取的. 目的:OutputStream Writer 一定是被写入的. 2.处理的 ...

  5. File System Minifilter Drivers(文件系统微型过滤驱动)入门

    问题: 公司之前有一套文件过滤驱动,但是在实施过程中经常出现问题,现在交由我维护.于是在边看代码的过程中,一边查看官方资料,进行整理. 这套文件过滤驱动的目的只要是根据应用层下发的策略来控制对某些特定 ...

  6. [Java] Collections - 源代码学习笔记

    Collection interface 集合接口 1. 在 Collections 体系中,接口 Collection 是根接口 2. 是指一组对象,这些对象被称为 Collection 的元素. ...

  7. java并发ThreadLocal

    ThreadLocal 实际就是一个map,一个线程对应一个local对象,线程创建时候,threadlocal随着创建,线程死亡ThreadLocal对象随着消失. runnable可以共享数据,要 ...

  8. openssl生成自签名证书

    1.生成x509格式的CA自签名证书 openssl req -new -x509 -keyout ca.key -out ca.crt 2.生成服务端的私钥(key文件)及申请证书文件csr文件 o ...

  9. ndroid调用平台功能具体技巧分享

    Android操作系统那个可以通过调用手机平台来实现一些特定的功能,诸如网页的显示,邮件的发送等等.那么今天就为大家总结了几个Android调用平台功能的应用技巧,帮助大家增加编程经验. Androi ...

  10. Spark RDD API具体解释(一) Map和Reduce

    本文由cmd markdown编辑.原始链接:https://www.zybuluo.com/jewes/note/35032 RDD是什么? RDD是Spark中的抽象数据结构类型,不论什么数据在S ...