`

【转】JS中的闭包

    博客分类:
  • JS
 
阅读更多

我们所熟知的主流语言,像C,java等,在函数内部只要执行了return,函数就会返回结果,

然后内存中删除该函数所在的区域,生命周期也就停止了,一般的js函数也是这样。
但是有闭包特性的js函数有点特殊。

举例子来说:

 

function a(){ 
    var i=0;
    function b(){ alert(++i); }
    return b;
}
var c = a();
c();

 

这是个标准的闭包,在函数a中定义了函数b,a又return了b的值,这些可以先不管。

 

var c = a();
c(); 

这两句执行很重要。
在var c = a();按照主流语言的函数特性,现在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。

 

另外,还有一种格式颇受争议:
(function(a,b))(a,b);
如果你使用过jquery,并且观察过他的代码,你就会很奇怪他的写法,网上有人也把这种格式叫做闭包。

 

分享到:
评论

相关推荐

    JS中的闭包理解。。。。。。。。

    js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。...• JavaScript中闭包作用域是词法作用域,即它在代码写好之后就被静态决定了它的作用域。

    JS闭包可被利用的常见场景

    JS闭包可被利用的常见场景。值得保留的文档。值得一看

    Javascript 闭包完整解释

    Javascript 闭包完整解释

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    js闭包详细讲解

    js闭包的详细讲解

    理解_JavaScript_闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

    js闭包个人理解

    js闭包的个人理解

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    js闭包学习

    javaScript无可争议的是如今前台开发最常用的技术,该文档讲解了javaScript中闭包技术,在jquery中大量的使用了该技术,学好可以更好的理解学习jquery。

    js闭包写法学习demo

    js闭包写法学习demo

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。

    JS匿名函数、闭包

    使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下: 创建并立即调用一个函数,这样既可以执行其中的代码,又不会在内存中留下对该函数的引用; 结果就是函数内部的所有...

    尚硅谷——JavaScript闭包

    JavaScript闭包 JavaScript闭包 JavaScript闭包 JavaScript闭包

    javascript 闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    JS闭包经典

    闭包一点即通 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    JS实现闭包中的沙箱模式示例

    主要介绍了JS实现闭包中的沙箱模式,结合实例形式分析了闭包模块化实现沙箱模式的原理、步骤与相关操作技巧,需要的朋友可以参考下

    JavaScript中闭包之浅析解读(必看篇)_.docx

    JavaScript中闭包之浅析解读(必看篇)_.docx

    js闭包理解之倒计时

    网上大多只是讲解js闭包的大概意思和小例子,但真实用于项目中又该怎么用呢。这个例子真实的告诉大家在项目中的用法

    [深入理解JS闭包]帮助你快速学习js的闭包,简单高效的文档资源

    帮助你快速学习js的闭包,简单高效的文档资源! 一、变量的作用域 二、如何从外部读取局部变量? 三、闭包的概念 四、闭包的用途 五、使用闭包的注意点 六、思考题 JavaScript闭包例子

Global site tag (gtag.js) - Google Analytics