所有内容均不是原创,单纯之前学习时做的笔记。内容结合了非常多的文章视频,已经记不清参考的哪里的了,所以就没有加参考说明了*。*
闭包
什么是闭包?
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的最常见的方式,一个A函数嵌套一个B函数,B函数使用A函数中的变量,我们称B函数为闭包函数。
闭包的特点是什么?
- 让外部访问函数内部变量成为可能
- 局部变量会常驻在内存中
- 可以避免使用全局变量,防止全局变量污染
闭包的用途?
- 读取函数内部的变量,让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
- 封装对象的私有属性和私有方法
使用闭包的注意点?
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除(一般是将引用的变量设置为null)
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法),把内部变量当作它的私有属性),这时一定要小心,不要随便改变父函数内部变量的值。
闭包常用的使用场景?
- 返回值(函数作为返回值被返回)
- 函数赋值(将内部函数赋值给一个外部变量)
- 函数参数(闭包可以通过函数参数传递函数形式来实现)
- IIFE(函数fn()都是声明后立即被调用的,因此可以使用IIFE来替代)
- 循环赋值
- getter和setter(通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部)
- 迭代器
- 区分首次
- 缓存机制(通过闭包加入缓存机制,使得相同的参数不用重复计算,来提高函数的性能)
- img对象数据上报(report函数并不是每一次都成功地发起了HTTP请求,原因是img是report函数中的局部作用域,当report函数的调用结束后,img局部变量随即被销毁,而此时或许还没来得及发出HTTP请求,现在把img变量用闭包封存起来,就能解决请求丢失的问题)