js作用域及闭包
作用域
执行环境是js最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。
1、全局执行环境就是最外围的一个执行环境,每一个函数都有自己的作用域
2、简单的说局部作用域可以访问外部作用域,外部作用域不能访问局部作用域
预解析:
这里涉及到一个js解析器的工作方式
首先: 他会在所在的执行环境找一些东西,比如var function 参数 所有变量在正式运行代码之前都提前赋予一个未定义,所有函数在未正式运行之前都是一个代码 块,遇到重名的只会留一个,变量和函数重名只会留下函数,函数和函数重名只会留下后面哪一个
然后:逐行解读代码
域:
script全局变量 全局函数,只要是一个域那么就会有预解析,然后执行,js是单线程,自上而下
函数 ,json 局部域
闭包
闭包是:能够访问另一个函数作用域内部变量的函数
闭包的使用场景:封装模块的时候,通过函数自执行函数的方式进行实现;或者模仿块级作用域的时候实现。以前es6没出来之前用的比较多
闭包的优点:
- 能够离开函数之后继续访问该函数的变量,变量一直会保存在内存中
- 闭包中的变量是私有的,只有闭包函数才有权限访问它。不会被外面的方法和属性污染
闭包的缺点:
- 会增加对内存的使用量,影响性能
- 不正确的使用闭包会导致内存泄露