EG。说这是我们的JavaScript代码:
let a = x => {
let y = x * 2
return z => x + y + z
}
let b = a(1)
let c = b(2)
我可以使用替换模型对此进行评估,还是需要环境模型?
我是这样开始的:
let c = ((x => {
let y = x * 2
return z => x + y + z
})(1))(2)
然后我需要在评估外部表达式(使用1
调用)之前评估内部表达式(使用2
调用)。但是对于替换它总是在外面。
这表明替代模型在这里不合适吗?或者从内到外以及从外向内进行评估是否犹豫不决?还是有其他方式来看待它吗?
答案 0 :(得分:3)
替换模型适用于闭包。基本上,您用绑定值替换绑定。你不需要环境模型。
const b = a(1) // ==
const b = z => 1 + (1 * 2) + z
const c = b(2) // ==
const c = 1 + (1 * 2) + 2 // ==
const c = 5
只有当您真正需要使用let
(在实际重新绑定它的情况下)您需要环境模型时才会这样做。
当谈到评估顺序时,很清楚,在a(1)(2)
这两个调用中,你不能先用参数2
进行第二次调用,因为它是在{a(1)
的结果上调用的。 1}}。因此,您需要知道a(1)
的结果,因此您需要先替换它,然后对该结果进行下一次调用。
let c = (x => {
let y = x * 2
return z => x + y + z
})(1)(2)
// substituting 1 for x ==>
let c = (z => 1 + 2 + z)(2)
// substituting 2 for z ==>
let c = 1 + 2 + 2