## 前言 面试问题: - 说一下对变量提升的理解 - 说明this的几种不同的使用场景 - 创建10个``标签,点击的时候弹出来对应的序号 - 如何理解作用域 - 实际开发中闭包的应用 涉及到的知识点: - 执行上下文 - this - 作用域 - 作用域链 - 闭包 ## 执行上下文 执行上下文主要有两种情况: - 全局代码: 一段` ``` 理解: - 多个上下级关系的作用域形成的链, 它的方向是从下向上的(从内到外) - 查找变量时就是沿着作用域链来查找的 查找一个变量的查找规则: ```javascript var a = 1 function fn1() { var b = 2 function fn2() { var c = 3 console.log(c) console.log(b) console.log(a) console.log(d) } fn2() } fn1() ``` - 在当前作用域下的执行上下文中查找对应的属性, 如果有直接返回, 否则进入2 - 在上一级作用域的执行上下文中查找对应的属性, 如果有直接返回, 否则进入3 - 再次执行2的相同操作, 直到全局作用域, 如果还找不到就抛出找不到的异常 ## 闭包 闭包就是能够读取其他函数内部变量的函数。 只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。 ### 如何产生闭包 **当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量或函数时, 就产生了闭包。** ### 闭包到底是什么? > 使用chrome调试查看 理解一: 闭包是嵌套的内部函数(绝大部分人) 理解二: 包含被引用变量 or 函数的对象(极少数人) 注意: 闭包存在于嵌套的内部函数中。 ### 产生闭包的条件 - 函数嵌套 - 内部函数引用了外部函数的数据(变量/函数)。 ## 常见的闭包 - 1. 将函数作为另一个函数的返回值 - 2. 将函数作为实参传递给另一个函数调用 ### 闭包1:将函数作为另一个函数的返回值