查看原文
其他

如何通俗切入JavaScript闭包?

qiangdada 开源中国 2018-11-04

#长按上图识别二维码,参与OSC源创会年终盛典#


首先,必须要提的就是闭包它绝对算的上是JavaScript中的一大难点,当然也是一大重点。N多高级程序都需要或者必须用到闭包才能得以实现。参考了N篇很牛叉的对于闭包理解的文章,接下来我将陈述一下鄙人自己对于闭包的理解,希望可以帮助小伙伴们通俗切入闭包这个点。

1、变量作用域

理解闭包很重要的一点就是需要先理解JavaScript特殊的变量作用域。

而变量作用域无非两种形式,全局变量和局部变量。而在JavaScript中,所有的函数它都可以在其内部访问到全局变量。




而在函数外部也无法读取函数内的局部变量。




当然在定义变量的时候,一定要记住加上var关键字,不然,JavaScript会默认你定义了一个全局变量。




2、函数外部访问局部变量

很多时候我们需要在一个函数中去访问另外一个函数内部的局部变量,可是上面又说了一个函数内部的局部变量是不允许被其他函数访问的。怎么办呢?

那我们就需要在函数内部在定义一个函数,这样就可以在其内部函数中访问到它内部的局部变量了。上代码理解。




而上面代码中的test2就是一个闭包,它是一种能够读取其他函数内部变量的函数,或者直接理解为定义在一个函数内部的函数。

3、闭包的用途

闭包可以用在很多地方。但它最大的用处有两点。第一点是以上提到的,访问其他函数内部的局部变量。还有一个很重要的用途则是让这些变量始终保存在内存中。不多解释,直接看代码理解。




4、闭包使用中需注意的问题


1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。

5、练习思考题

当你可以理解以下两段代码运行结果时,那么恭喜你,你已经理解了闭包的运行机制了。





END

推荐阅读
一入前端深似海,未来路该何去何从?Java 要死了吗?不!我来告诉你为什么!31 款轻量高效的开源 JavaScript 插件和库10月成都、重庆源创会,程序媛带您玩转 iOS 10 推送


     点击“阅读原文”查看更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存