判断给定add()函数是否具有引用透明性及相关定义疑问
判断add()函数的引用透明性
首先,先明确引用透明性的核心判定标准:
- 函数在相同输入参数下,每次调用必须返回完全相同的结果
- 函数执行过程中不能产生任何可观察的副作用(比如修改全局变量、修改传入参数、IO操作等)
- 满足以上两点时,函数调用可以被其返回值直接替换,且整个程序的行为完全保持不变
接下来分析你给出的代码:
const appState = { runningTotal: 0 } function add(x, y) { const total = x + y; appState.runningTotal += total; return total; }
这个add()函数不具备引用透明性,原因很简单:
- 它在执行过程中修改了全局变量
appState.runningTotal,这是一个明确的可观察副作用 - 举个实际场景:
- 第一次调用
add(1, 2),返回3,同时appState.runningTotal变为3 - 第二次调用
add(1, 2),依然返回3,但appState.runningTotal变为6
- 第一次调用
- 如果我们尝试把
add(1, 2)替换成它的返回值3,程序里appState.runningTotal根本不会被修改,这和直接调用函数的行为完全不一致——这就违反了引用透明性的核心要求
内容的提问来源于stack exchange,提问作者Chase Miller
相关产品推荐
相关产品推荐

