目录
- 闭包
- 变量提升
- 函数提升
闭包
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。(mdn)
-
怎么理解闭包?
- 闭包 = 内层函数 + 外层函数的变量
-
闭包的作用?
- 封闭数据,实现数据私有,外部也可以访问函数内部的变量
- 闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来
-
闭包可能引起的问题?
- 内存泄漏
变量提升
允许在变量声明之前即被访问。
<script>console.log(str + 'hhh');var str = 'aaa'console.log(str + 'hhh');console.log(str2 + 'lll');let str2 = 'bbb'console.log(str2 + 'lll');</script>
总结:
- 变量在未声明即被访问时会报语法错误
- 变量在声明之前即被访问,变量的值为 undefined
- let 声明的变量不存在变量提升,推荐使用 let
- 变量提升出现在相同作用域当中
- 实际开发中推荐先声明再访问变量
函数提升
函数提升与变量提升比较类似,是指函数在声明之前即可被调用。
总结:
- 函数提升能够使函数的声明调用更灵活
- 函数表达式不存在提升的现象
- 函数提升出现在相同作用域当中