闭包:一个函数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. poj 2983Is the Information Reliable?

    http://poj.org/problem?id=2983 #include<cstdio> #include<cstring> #include<algorithm& ...

  2. 用于 Visual Studio 和 ASP.NET 的 Web 应用程序项目部署常见问题

    https://msdn.microsoft.com/zh-cn/library/ee942158(v=vs.110).aspx#can_i_exclude_specific_files_or_fol ...

  3. POJ2115 C Looooops(数论)

    题目链接. 分析: 数论了解的还不算太多,解的时候,碰到了不小的麻烦. 设答案为x,n = (1<<k), 则 (A+C*x) % n == B 即 (A+C*x) ≡ B (mod n) ...

  4. chrome播放语音时,在chrome 控制台中报 DOMException: The play() request was interrupted by a call to pause(). 的问题.

    $(document).ready(function () { var audioElement = $( '<audio>' + ' <source src="" ...

  5. POJ1595_Prime Cuts【素数】【水题】

    Prime Cuts Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 10464Accepted: 3994 Description ...

  6. monkeyrunner 详细介绍

    MonkeyRunner: monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monkeyrunner,您可以写出一个 ...

  7. Linux 磁盘挂载和mount共享

      针对Linux服务器的磁盘挂载mount和共享做简单操作说明: 1.  查看已使用的磁盘情况 df –h 2.  查看所有磁盘 fdisk –l 3.  查看指定磁盘“/dev/xvde”的分区情 ...

  8. Linux设备驱动中断机制

    [主要内容] Linux设备驱动编程中的中断与定时器处理 [正文] 一.基础知识 1.中断 所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停执行当前的程序,转去处理突发 ...

  9. [转] java Class类

    Class类(在java.lang包中,Instances of the class Classrepresent classes and interfaces in a running Javaap ...

  10. SSH端口修改

    打开SSDH配置文件: vim /etc/ssh/sshd_config 添加端口号:Port 60000 重启服务:service sshd restart