作用域和闭包
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>闭包和作用域</title> </head> <body> <script> let aa = `LHS RHS 作用域 作用域链 词法作用域 块级作用域 闭包`; let a = `在变量中存储值,并且在稍后取出或修改这些值 LHS 变量赋值 RHS 变量查询 LHS 和 RHS 获取变量的位置就是作用域 作用域是定义变量的区域,它决定了当前代码对变量的访问权限 全局作用域和函数作用域 可执行代码内部访问变量时,先在本地作用域中找,找到目标变量即返回,否则会去父级作用域中找 一直找到全局作用域,这种嵌套机制,称为作用域链 词法作用域,也叫静态作用域,函数被定义时,作用域已经被确定; 创建作用域:定义函数;使用 let const; 有权访问另一函数中变量的函数称为闭包 应用场景:单例模式;它保证了一个类只有一个实例,实现方法是先判断实例是否存在,如果存在就直接返回 否则就创建了再返回,好处是 避免了重复实例化带来的内存开销;柯里化,参数的复用,高阶用法; 模仿私有属性; 由于闭包使用过渡而导致的内存占用无法释放的情况,称之为内存泄露; 当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返回给操作是系统或内存池的现象; 内存泄露可能导致程序卡顿甚至崩溃; 内存泄露原因:全局变量的无意创建;移动DOM元素前忘记注销掉其中绑定的事件; 排查手段:memory 解决办法:使用严格模式;关注dom生命周期,在销毁阶段记得解绑相关事件;使用事件委托统一处理; 避免过渡使用闭包; `; </script> </body> </html>