天天看点

js 闭包 小结

        刚参加工作时就听到js闭包这个东东。诶,这是个啥东西?听上去很高大上而又神秘莫测!后来断断续续在网上查过多次,好多相关的文章感觉大部分都是copy copy copy 再copy!总之最后还是模模糊糊,不是很明了。

        好了,说正事。前段时间工作中需要自己写前端,写了几个js插件后突然对闭包有了清晰的认识。现在有时间总结一下。

        其实闭包很简单。要想出现闭包,首先js要有一块封闭的代码区域。所谓封闭的代码区域,就很常见了 一个方法、一个代码块 、一个对象等都可看做封闭的代码区域。然后,在这个封闭的区域以外 调用封闭区域内的方法,或者引用 封闭区域内的对象时,这个封闭的区域就是一个闭包啦。空口无凭来上张图吧。

js 闭包 小结

图中的stepGuide(右边红框内Closure(闭包)内)为一个jQuery自定义扩展组件(封闭代码区域),jump为此组件的一个内部方法(已经设置为组件实例方法,即外部通过实例可以调用),而此断点的调用场景为:stepGuide.jump(1) 。即形成了外部程序调用封闭区域内的方法,此时浏览器就将stepGuide视为一个闭包了。

那么闭包有什么好处?为什要用闭包? 闭包最大的好处就是可以起到数据隔离的作用。典型的使用场景就是可以避免大量使用全局变量,使用过多的全局变量容易产生冲突、混乱,且代码可读性差。而使用闭包内部变量,只能在闭包内部操作或者使用闭包内的方法操作,不会与外界产生冲突,也就不会出现全局变量的困扰。可以简单的把闭包内的成员理解成是java中 private修饰的成员。

当然闭包有利也有弊。因为闭包的成员被外部程序引用,所以浏览器会在内存中保存闭包的现场环境不释放。如果乱用闭包而不适时的销毁相关的引用,则可能导致系统内存占用过高。势必影响js性能,严重的可能直接导致浏览器崩溃。所以能够恰当的使用闭包才是王道。

以上个人见解勿喷,欢迎各路大佬指导讨论。