闭包

  看了阮一峰老师的学习JavaScript闭包,发表一下我的总结。

  JS里面有三种作用域:全局作用域,函数作用域和块作用域,而变量的作用域只有两种:全局变量和局部变量。因为函数内部可以读取全局变量,但是全局变量无法读取函数内部的变量,相当于函数已经把自己的变量给封装起来了,所以正常情况下是无法获取函数内部变量值的,只能通过在函数内部再定义一个函数,就相当于在函数里再创建了一个子作用域,构成链式作用域。子对象可以沿着作用域链寻找所有父对象的变量,如果不只想在闭包内获取函数的变量值,还想要在函数外部获取的话,就需要把这个闭包函数作为父对象的返回值,这样就可以直接在全局中调用父对象的函数,并赋给一个变量,再调用这个变量。

  所以闭包的本质是在函数内部(父对象{}内)和函数外部(父对象{}外)直接架起桥梁,二者的变量可以通过这座桥梁来来往往。闭包的用途主要有两个:

  1.读取函数内部的值

  2.让变量的值始终保持在内存中,无法被回收

  正由于闭包的第二个用途,所以闭包会使得闭包函数和它所在的父对象都被保存在内存中,内存消耗很大,所以不可以滥用闭包,不然会造成性能问题,甚至在 IE 中会造成泄漏。解决方法是在退出函数之前,将需要被闭包使用的局部变量删除掉。

  闭包还有一个特别大的权利,可以隔空改变父函数的值,此时的父函数有点类似于class,而闭包类似于一个public函数,这个public函数可以访问并且改变class里的变量,这个权利要是滥用了也会造成很严重的后果。

  之后可能会再补充一些闭包的总结。关于闭包的使用,其实不单单是看总结就能完全把握的,还需要多做题,练成题感之后就不容易被坑了。

posted on 2020-08-05 23:13  heySarah  阅读(85)  评论(0编辑  收藏  举报

导航