Web前端之路让前端飞JavaScript 进阶营

说说JS中那个神奇的存在-Closure(闭包)

2017-11-05  本文已影响193人  简xiaoyao

在JS的世界中,闭包一直是一个神奇的存在,它无处不在,却又很难感知;对于很多JS程序员来说,也许写了多年的程序之后也并不清楚闭包为何物,但是这也并不妨碍他们编写JS程序,从另一方面来说,也许他们无意中就写了一段产生闭包的代码,自己却毫不知情

何为闭包

在解释一个事物之前,一般都需要对其进行概念抽象,我想,闭包的概念可以定义为:所谓闭包, 即一个方法内部能够持续的访问其语义作用域(包括其嵌套作用域),即使对该方法的调用发生在该语义作用域之外(如果对语义作用域的概念不了解,可以参考:JS的作用域),这句概念定义过于抽象,下面举例来说明:

function foo() {
    var a = 2;

    function bar() {
        console.log( a );
    }

    return bar;
}

var baz = foo();

baz(); // 2

再一张图例来解释这段程序

closure_desc.png
如果基于该代码示例对闭包概念进行重新描述可以是:语义作用域foo内部的方法bar()存在对foo的内部变量a的引用,此处即产生了闭包,然后即便在语义作用域foo外通过方法bar()的引用baz()调用方法bar(),此时依然可以访问变量a,并得到它的值;需要注意的是,在bar()方法内部引用变量a时闭包已经产生,或者称之为方法bar()在语义作用域foo上产生了一个闭包,而在语义作用域foo外对bar()的调用只是让闭包显现的方式,并不是在此处产生闭包,那么进一步也可以说,在方法bar()内部通过语义作用域的变量找寻规则持有语义作用域foo的变量a的访问权即是闭包最重要的实质(也是唯一的实质)

闭包的使用

当学到一门新技术或语言的新特性,很多人都想知道其应用场景,并迫不及待的在下一次实战中进行使用,这是一种好的学习新知识的方式,但我认为对于闭包,很多时候不是你不会用,而是你的代码已经产生了闭包自己却浑然不知,所以我认为我们需要做的是了解闭包的概念并在自己的JS代码中找寻自己已经不经意间写出的闭包,进一步加深对其的认识,然后做到从无意识的产生闭包到有意识的利用闭包,需要记住:闭包在JS中无处不在,下面我将给出闭包的几种典型应用场景并简单罗列不合理的使用闭包会带来哪些问题:

总结

本文对闭包的概念进行了解释,并给出了产生闭包的典型场景和需要注意的点,虽然实际的情况会比本文所列举的实例更复杂,更多样,但万变不离其中,把握闭包的本质,就能合理的利用闭包带来的魔力,为我所用;同时需要注意,闭包不是一个你需要努力掌握并刻意使用的技术,它只是基于JS的其他特性自然产生(就如本文中一直用的一个词是产生闭包)的一种特性,你需要做的就是了解它,拥抱它

上一篇 下一篇

猜你喜欢

热点阅读