2024大二上js高级+ES6学习9.26(闭包,递归函数)
9.26.2024
1.闭包
什么是闭包:
闭包的作用:
Return 的函数作为fn的子函数,可以使用fn的局部变量num,局部变量num要等所有使用它的函数调用完毕后才销毁
2.闭包的案例
点击li会发现输出4
在 JavaScript 中,事件处理器(如 onclick)是异步的,这意味着它们不会立即执行,而是在特定的事件发生时(在这个例子中,是用户点击元素时)才会被调用。因此,尽管你在循环中为每个元素的 onclick 属性分配了函数,但这些函数并不会在循环结束之前执行。它们只是被设置为在将来某个时刻(用户点击元素时)可能被调用的函数。
以下是为什么这些函数是在循环结束后才调用的详细解释:
- 事件监听器的异步性质:
- onclick 属性设置的函数是一个事件监听器。它告诉浏览器在用户点击元素时执行特定的函数。这个函数的调用是异步的,因为它依赖于用户的行为。
- 事件循环:
- JavaScript 运行在单线程环境中,使用事件循环来处理异步操作。当循环中的函数设置完毕后,JavaScript 引擎会继续执行其他任务。只有当相应的事件(如点击)发生时,事件循环才会从消息队列中取出事件监听器函数并执行。
- 非阻塞行为:
- JavaScript 设计为非阻塞语言,这意味着它允许页面在执行长时间运行的脚本时仍然响应用户操作。设置事件监听器(如 onclick)不会阻塞代码的执行,因此循环可以快速完成,而事件监听器函数则在事件发生时被调用。
- 用户交互触发:
- onclick 函数只有在用户实际点击元素时才会执行。这是用户交互的一部分,而不是代码执行的一部分。
- 闭包和变量引用:
- 在循环中,每个 onclick 函数捕获了循环变量 i 的当前引用。由于这些函数是闭包,它们引用的是循环变量 i 而不是它的值的副本。因此,当这些函数最终被调用时(用户点击),它们引用的 i 变量的值是循环结束时的值。
- 循环结束:
- 循环结束意味着所有的 onclick 函数已经被设置好,但是还没有被调用。它们只是在等待用户的点击事件。
这就是为什么在循环中设置的 onclick 函数会在循环结束后才被调用的原因。这种行为是 JavaScript 事件驱动和异步执行模型的一部分。
闭包不一定是好的:会占用内存
案例实现原理:应用立即执行函数的立即响应包
案例一:
案例二:
案例三:出租车计费器
思考题:
3、递归函数
案例:
4.递归遍历数据:
升级:使用变量obj来接受返回的数据