闭包与嵌套函数的区别
嵌套函数
嵌套函数是指在一个函数内部定义的另一个函数。嵌套函数可以访问其外部函数的变量和参数,但在外部函数执行完毕后,嵌套函数通常无法再访问外部函数的变量。
闭包
闭包可以看作是一种特殊的嵌套函数,只是这个嵌套函数的返回是一个函数引用,而不是一个值,当嵌套函数的外部执行完成后,由于返回的是内部函数的引用,所以内部函数所涉及到的一些参数变量仍然可被访问。
闭包的概念在许多高级编程语言中都存在,并且它们通常以类似的方式实现,即通过匿名函数或 lambda 表达式来捕获并访问外部函数的变量。这些语言包括但不限于 JavaScript、Python、Ruby、Lua、Swift、Kotlin、C# 和 Go。因此,闭包并不是 JavaScript 独有的特性,而是一个广泛存在于支持高阶函数和函数式编程特性的语言中的概念。
从内存中理解
嵌套函数执行结束后,堆栈中的上下文会被清理,相关变量会被回收。
闭包返回的是一个函数引用,这个引用保留了对原始词法环境的访问权限,因此相关的上下文不会被完全清理,变量仍然能被访问。