浅谈JavaScript闭包

  初学JavaScript闭包时,闭包这个概念在我眼里及其的神秘,也不知道这个东西在讲什么,尤为某些地方的闭包概念定义的很是抽象,属于那种原本你可能明白这个概念,看了反而又把你给绕糊涂了,学习了这么长时间的JavaScript,看了很多的书,对闭包的这个概念也算是稍稍有点体会的了,这里顺便推荐两本书《你不知道的JavaScript》和《JavaScript忍者秘籍》。
  以前有次面试的时候,面试官让我写一个闭包的例子,我就写了下面的代码:javascript

var a = 100;
(function(){
    console.log(a); //100
})();

上面这个例子从广义上讲确实算是一个闭包的例子,可是实质上讲其实算是一个词法做用域的例子,其中涉及到RHS。但却不是一个很合适的讲述闭包的例子,后面看到一个例子算是一个比较好解释闭包的代码:java

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忍者秘籍》这两本书,里面对闭包讲解的都很是的棒。code

相关文章
相关标签/搜索