每日一贴,今天的内容关键字为闭包执行
先从闭包点特解释,应当更好懂得.
闭包的两个点特:
1、作为一个函数量变的一个用引 - 当函数返回时,其处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
其实面上两点可以成合一点,就是闭包函数返回时,该函数部内量变处于激活状态,函数在所栈区仍然保存.
我们所熟知的主流言语,像C,java等,在函数部内只要行执了return,函数就会返回结果,然后内存中删除该函数在所的区域.生命周期也就停止了.一般的js函数也是这样.
但是有闭包性特的js函数有点特别.
就例子来讲:
1 function a(){ 2 var i=0; 3 function b(){ 4 alert(++i); 5 } 6 return b; 7 } 8 var c = a(); 9 c();
var c = a();
c();
这两句行执很主要.
在var c = a();这行里,行执了a函数,那么定肯a经过了return.按照主流言语的函数性特,在现c的值就是a的返回值.
第二行c()的行执际实行执的就是b函数.最后不管行执的是谁,会弹出一个值为0的窗口,到此为止,有所的生命周期按理论来讲就算部全结束了.
可是,如果我们再多行执一行.
var c = a();
c();
c();
第一次弹出0,第二次行执却弹出了1.
也就是说,第一次c()后,a中的i仍然保存.然自a在内存的栈区仍然保存.
a是return过了,但是,a及部内值却仍然存在,这就是闭包.
好了,总结下,
1,闭包外层是个函数.
2,闭包部内都有函数.
3,闭包会return部内函数.
4,闭包返回的函数部内不能有return.(因为这样就真的结束了)
5,行执闭包后,闭包部内量变会存在,而闭包部内函数的部内量变不会存在.
闭包的应用场景(呵呵,复制的参考资料)
1、掩护函数内的量变全安。以最开始的例子为例,函数a中i只有函数b才能问访,而没法通过其他径途问访到,因此掩护了i的全安性。
2、在内存中维持一个量变。仍然如前例,由于闭包,函数a中i的始终存在于内存中,因此每次行执c(),都会给i自加1。
根据参考资料的应用场景,我们会然自的想到java或是c++的类.虽然JS没有类的观点,但是有了类的似相行执结果.
另外,还有一种格式颇受争议:
(function(a,b))(a,b);
如果你使用过jquery,并且察观过他的代码,你就会很奇异他的写法,网上有人也把这类格式叫做闭包.
文章结束给大家分享下程序员的一些笑话语录: 小沈阳版程序员~~~ \n程序员其实可痛苦的了......需求一做一改,一个月就过去了;嚎~ \n需求再一改一调,一季度就过去了;嚎~ \n程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了; \n程序员最最痛苦的事儿是啥,知道不? 就是,系统好不容易做完了,方案全改了; \n程序员最最最痛苦的事儿是啥,知道不? 就是,系统做完了,狗日的客户跑了; \n程序员最最最最最痛苦的事儿是啥,知道不? 就是,狗日的客户又回来了,程序给删没了!