cs61a 02 高阶函数闭包调用链关系

143 阅读2分钟

多层闭包调用关系

image-20220429141259879.png

如上所示,我们可以看到一个两层闭包结构,外套一个传进来的lambda表达式,相当于四层套用

从上面的跟踪图可以看到如下几个问题

1、闭包里的全局帧和object只有在执行时才创建

2、对于有多层闭包,每次执行只返回第一层的闭包,比如执行curry2返回的是f(x)这层函数,g(y)是属于f(x)里的函数体,只有在执行f()时才会调用执行。实际上就是闭包就是函数套了一层函数体,只是这个函数体本身是一个函数,所以返回的是一个函数引用。只有在执行函数引用时才会执行函数体(内层的函数)。

3、对于内层 函数调用的函数如果找不到,则返回向上层找,比如f5的函数,g函数执行会调用h函数,但在g当层找不到h函数,于是它向上走,找到第一层curry2才找到h函数

函数体、变量、形参、变量的生效区域和生命周期

image-20220429152953586.png

1、函数是一种特殊的变量,是变量名称到函数体的映射的关系,所以同名变量先后指到不同函数体,最终是最新的函数体跟变量名绑定关系,如上面的f,最后是绑定到f(f,x)

2、形参

如上述第三行f(f,x)

这里的f和x都是形参,在第16行调用执行时

f=g(),x =n

而在第14行执行return f(x+n)时,这里的是x实参n传给x,而+后面的n是全局变量n,f=g 所以相当于return g(14) == f(x+n)

f = g

x = n (x 是形态,n是实参)

n 全局变量

3、上面的函数名f,g都是在不同生命周期内被最新的函数体可替换了映射关系。