静态/动态作用域下嵌套函数跨层级调用权限咨询
函数调用权限问题分析
背景信息
嵌套函数结构
def a(): def b(): def c(): def d(): def t():
已知合法调用规则
- t 和 a 可互相调用
- a 可调用 b、d
- b 可调用 d、a、c
- d 可调用 b、a
- c 可调用 b
- 合法调用栈示例:
t a t a d a b c
静态作用域(词法作用域)下的权限判断
c能否调用外层多层的a?
可以。静态作用域中,函数能访问定义时所在的外层嵌套作用域中的名字。c定义在b内部,b又定义在a内部,所以c的作用域链包含a的作用域,可直接调用a。c能否调用未嵌套于其中的t?
可以。t是顶层全局函数,c的作用域链最终会延伸到全局作用域,因此能访问并调用t。a能否调用内层多层的c?
不可以。静态作用域中,外层函数无法直接访问内层嵌套函数的内部名字。c是b的内层函数,仅在b的作用域内可见,a的作用域中不存在c的定义,因此无法调用。c能否调用d?
可以。d定义在a内部,与b同级,c的作用域链可以到达a的作用域,能访问到d的定义,因此可调用d。
动态作用域下的权限判断
动态作用域的权限基于调用栈,函数能访问当前调用栈上层作用域中的名字:
c能否调用外层多层的a?
可以。从合法调用栈t a t a d a b c来看,c的调用栈上层存在多个a的作用域,动态作用域下可直接访问并调用a。c能否调用未嵌套于其中的t?
可以。调用栈的最上层是t的作用域,c能通过调用栈访问到t的定义,因此可调用t。a能否调用内层多层的c?
不可以。a的调用时机早于c,当a被调用时,c的作用域还未被推入调用栈;即使在示例调用栈中,a的作用域也在c的作用域之前,a无法反向访问后续栈帧中的c,因此无法调用。c能否调用d?
可以。调用栈中c的上层存在a的作用域,而d是a的内部函数,因此c能通过栈帧访问到d的定义,可调用d。
内容的提问来源于stack exchange,提问作者kiyo-koji
相关产品推荐
相关产品推荐

