浅谈JavaScript闭包
来源:互联网 发布:c语言经典笔试题 编辑:程序博客网 时间:2024/05/19 16:05
初学JavaScript闭包时,闭包这个概念在我眼里及其的神秘,也不知道这个东西在讲什么,尤其某些地方的闭包概念定义的非常抽象,属于那种本来你可能明白这个概念,看了反而又把你给绕糊涂了,学习了这么长时间的JavaScript,看了不少的书,对闭包的这个概念也算是稍稍有点体会的了,这里顺便推荐两本书《你不知道的JavaScript》和《JavaScript忍者秘籍》。
之前有次面试的时候,面试官让我写一个闭包的例子,我就写了下面的代码:
1234
var a = 100;(function(){console.log(a); //100})();
上面这个例子从广义上讲确实算是一个闭包的例子,但是实质上讲其实算是一个词法作用域的例子,其中涉及到RHS。但却不是一个很合适的讲述闭包的例子,后面看到一个例子算是一个比较好解释闭包的代码:
12345678910
function fn(){var a = 100;function func(){console.log(a);}return func;}var func = fn();func(); //100
这个例子才算是一个比较好的闭包的概念。
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前的词法作用域之外的执行的。
上面这个概念是引申自《你所不知道的JavaScript》中,变量a
定义在函数fn()
的作用域中,并且函数fn()
中含有一个内部函数func()
,内部函数func()
持有对变量a的引用。在正常情况下,当函数func
执行后就,内部的变量就会被垃圾回收机制所回收(比如变量a
)。但是函数fn()
返回了内部函数func()
,内部函数func()
会随时访问变量a
,所以垃圾回收机制是不会回收函数fn()
的内部作用域的,这就是闭包的含义。也就是
函数在定义的词法作用域以外的地方被调用,闭包使得函数可以继续访问定义时的词法作用域。
现在你对闭包的理解会不会有种恍然大悟的感觉呢?如果没有?那建议看看《你所不知道的JavaScript》和《JavaScript忍者秘籍》这两本书,里面对闭包讲解的都非常的棒。
- 浅谈JavaScript闭包
- JavaScript 闭包浅谈
- javascript浅谈闭包
- javascript闭包浅谈
- 浅谈javascript闭包
- 浅谈JavaScript闭包
- 浅谈JavaScript闭包
- 浅谈Javascript的闭包
- 浅谈javaScript中的闭包
- 浅谈javascript闭包(closure)
- 浅谈javascript闭包的重要性
- 浅谈JavaScript闭包(Closure)
- JavaScript-闭包(Closure)浅谈
- 浅谈JavaScript的闭包和作用域链
- javascript面向对象、私有作用域、闭包浅谈
- JavaScript中的作用域和闭包浅谈
- 浅谈JavaScript原型链继承方式与闭包
- 浅谈C#闭包
- sublime text 3解放鼠标的快捷键总结
- 51nod 1267 4个数和为0(STL,二分)
- IKAnalyzer2012FF_u1.jar 以及PinYin4J 使用出现的问题
- 模糊遍历jQuery
- UVA11991(map+vector 离散化处理)
- 浅谈JavaScript闭包
- [评论]“杀猪爱好”证明贪官有两面性
- JS中设置数组长度的意义是什么
- JavaScript面对对象(上)
- 1.一个简单的计算器,用JS书写
- JAVA 环境变量的配置(记录)
- 循环队列详解
- c++容器
- 函数表达式