替代模型是否适用于闭包?或者你需要一个环境模型?

Does the substitution model work for closures? Or do you need an environment model?

例如。假设这是我们的 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 调用)。但对于替换,它总是由外而内。

这是否表明这里的替代模型不合适?或者从内到外和从外到内进行评估是否符合犹太洁食标准?还是有其他的方式来看待它?

替换模型适用于闭包。基本上,您将绑定替换为其绑定值。您不需要环境模型。

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 进行第二次调用,因为它是在 [=15= 的结果上调用的].因此,您需要知道 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