资讯专栏INFORMATION COLUMN

浅谈JavaScript闭包

hsluoyz / 2797人阅读

摘要:但是函数返回了内部函数,内部函数会随时访问变量所以垃圾回收机制是不会回收函数的内部作用域的,这就是闭包的含义。也就是函数在定义的词法作用域以外的地方被调用,闭包使得函数可以继续访问定义时的词法作用域。

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81142.html

相关文章

  • 浅谈JavaScript中的闭包

    摘要:在内部,理所当然能访问到局部变量,但当作为的返回值赋给外的全局变量时,神奇的事情发生了在全局作用域中访问到了,这就是闭包。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。 一、闭包是什么? 《JavaScript高级程序设计》中写道:闭包是指有权访问另一个函数作用域中的变量的函数,如果用下定义的观点看,这句话就是说闭包是函数,我...

    Riddler 评论0 收藏0
  • 浅谈Javascript闭包和匿名函数【1】

    摘要:我们可以用普通函数内部嵌套匿名函数,形成一个闭包来使变量驻留在内存中。局部变量闭包为什么要将赋值给变量呢这里我们就要谈到匿名函数调用问题匿名函数如何调用还是上面的例子会将整个函数体打印出来这样才调用了函数内部的匿名函数看到这里。 闭包含义: 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。 这...

    cyqian 评论0 收藏0
  • 浅谈Javascript闭包中作用域及内存泄漏问题

    摘要:将作用域赋值给变量这里的作用域是,而不是将作用域赋值给一个变量闭包返回浏览器中内存泄漏问题大家都知道,闭包会使变量驻留在内存中,这也就导致了内存泄漏。 上一章我们讲了匿名函数和闭包,这次我们来谈谈闭包中作用域this的问题。 大家都知道,this对象是在运行时基于函数的执行环境绑定的,如果this在全局就是[object window],如果在对象内部就是指向这个对象,而闭包却是在运行...

    source 评论0 收藏0
  • 云天视角-浅谈闭包

    摘要:函数在执行的时候执行函数,将当前的变量对象由于当前的环境是函数,所以将其活动对象作为变量对象添加到作用域链的前端。此时,由于在执行,而作用域链也存在,所以可以在作用域链上进行查找,去访问的变量。 一、现状 闭包是jser绕不过的坎,一直在都在说,套用 simpson 的话来说:JavaScript中闭包无处不在,你只需要能够识别并拥抱它。 闭包是基于词法作用域书写代码时的自然结果,你甚...

    nanfeiyan 评论0 收藏0
  • 浅谈JavaScript闭包的理解

    摘要:关于循环和闭包当循环和闭包结合在一起时,经常会产生让初学者觉得匪夷所思的问题。闭包是一把双刃剑是比较难以理解和掌握的部分,它十分强大,却也有很大的缺陷,如何使用它完全取决于你自己。 在谈闭包之前,我们首先要了解几个概念: 什么是函数表达式? 与函数声明有何不同? JavaScript查找标识符的机制 JavaScript的作用域是词法作用域 JavaScript的垃圾回收机制 先来...

    missonce 评论0 收藏0

发表评论

0条评论

hsluoyz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<