动态作用域示例争议:为何我与Bing AI的输出判断不一致?
动态作用域的代码结果分析
首先明确动态作用域的核心规则:变量引用时,会沿着函数的调用栈向上查找,优先使用调用链中上层函数环境里的变量,而非函数定义时的上层环境。
针对你提供的伪代码,我们按动态作用域规则逐步推导:
x = 10 function f() { x = 20 function g() { print x } g() } function h() { x = 30 f() } h()
- 初始全局环境中,
x = 10。 - 调用
h():- 由于
h()内未声明局部x,赋值x = 30会修改调用h()的上层环境(全局环境)中的x,此时全局x变为30。 - 接着调用
f():f()内同样未声明局部x,赋值x = 20会修改调用f()的上层环境(全局环境)中的x,此时全局x变为20。- 调用
g():g()引用x时,沿调用栈向上查找:先看f()的环境(无局部x),再看h()的环境(无局部x),最终找到全局环境中的x = 20,因此输出20。
- 由于
你的理解是正确的,这段代码在标准动态作用域规则下应输出20。Bing AI的结论有误,可能是混淆了动态作用域的查找逻辑,或是对伪代码的变量声明规则做了错误假设。
内容的提问来源于stack exchange,提问作者Jeff Boker
相关产品推荐
相关产品推荐

