我感觉好像缺少了一些东西。这里是:
嵌套函数和闭包
您可以将一个函数嵌套在一个函数中。嵌套(内部)函数专用于其包含(外部)函数。它也形成一个封闭。闭包是一个表达式(通常是一个函数),可以具有自由变量以及绑定这些变量的环境(“关闭”表达式)。
由于嵌套函数是闭包,因此这意味着嵌套函数可以“继承”其包含函数的参数和变量。换句话说,内部函数包含外部函数的范围。
总结一下:
内部函数只能从外部的语句访问
功能。
内部函数形成一个闭包:内部函数可以使用外部函数的参数和变量,而外部函数可以使用外部函数的参数和变量。
函数不能使用内部的参数和变量
功能。
以下示例显示了嵌套函数:
function addSquares(a,b) {
function square(x) {
return x * x;
}
return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41
由于内部函数形成一个闭包,因此您可以调用外部函数并为外部函数和内部函数指定参数:
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3); // Think of it like: give me a function that adds 3 to whatever you give it
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
最佳答案
闭包无疑是一开始令人困惑的话题,但实际上归结为:
每当您具有嵌套函数时,从技术上来讲,您都有一个闭包。
仅仅因为您有一个闭包并不一定意味着您的代码将受到任何重大影响。
3.当嵌套函数依赖于在更高的函数(祖先函数)中声明的变量,并且嵌套函数的生存期比声明那些依赖变量的函数的生命周期长时,您就有一个需要了解的关闭情况。
这些变量(在嵌套函数中使用,但在高阶函数中也称为自由变量)在声明它们的函数完成时无法被垃圾回收,因为嵌套函数将需要它们,它们将超过其父函数/祖先。这种“无效”可能是由于嵌套函数的父级将嵌套函数返回给更高级别的调用者,或者将嵌套函数分配给了另一个对象(例如DOM对象)。
发生这种情况时,将围绕free变量创建一个闭包,并且该变量的作用域现在也由依赖于此变量的任何其他内存中函数共享。这会导致共享作用域,并且通常不会因应该具有自己的值的功能而引起混淆。在那些情况下,修改内部函数以接收祖先的自由变量的COPY可以解决这种混乱。