提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
了解闭包的概念和应用场景;
简述闭包的实现过程
提示:以下是本篇文章正文内容,下面案例可供参考
一、闭包是什么?
闭包指有权访问另一个函数作用域中的变量的函数(从内部函数访问外部函数的作用域),可简单理解成“定义在一个函数内部的函数”。
二、问题引入
问题1:闭包是什么?有什么用?
闭包是在函数外部可以使用函数内部的变量,本质是在函数内定义一个函数,可以在函数内部定义一个变量,并在函数外部创建一个访问该变量的函数
本质:上级作用域
内的变量,因为被下级作用域
内引用,而没有被释放,直到下级作用域执行完以后才正常得到释放。
- 由于闭包会引用父级作用域中的变量,因此,这些变量不会在函数执行完毕时被垃圾回收机制回收,从而占用了内存资源(内存泄漏)
- 性能问题:闭包会在每次函数调用时创建新的作用域链,因此会增加函数的内存消耗和运行时间。在循环中创建闭包时,尤其需要注意性能问题。
- 可读性问题:闭包会延长变量的生命周期并隐式传递数据
问题2:怎幺才能在外部,访问到函数内部的变量?
正常情况下,函数外部无法读取函数内部声明的变量。
解决办法:在函数的内部,再定义一个函数,内函数引用外部变量。
当函数内部返回一个函数且子函数没在父级作用域内完成整个生命周期的话,父级函数是没办法完成一整个生命周期的,闭包正是利用这一点卡住了父级函数的作用域。
当一个函数被调用时,它会创建一个新的执行环境,其中包含该函数的局部变量和参数。这个执行环境还包括一个指向该函数定义所在的作用域的引用。这个引用被称为函数的“作用域链”,它是由所有包含该函数定义的作用域对象组成的链表。
内部访问外部定义的自由变量的规则:变量访问原则--就近原则,由内而外,沿着作用域链,子对象会一级一级地向上寻找所有父对象的变量。
总结
(1)在 JavaScript 中,闭包是指一个函数能够访问在它外部定义的变量。
(2)闭包的本质是将函数和其引用的外部变量封装在一起,形成了一个不受外部干扰的环境,使得函数可以访问和修改外部变量,并且这些修改也会反映到函数外部的变量中。