JavaScript 函数参数的关闭,取决于函数作为参数传递的方式,我看到两种不同的结果

Closure of JavaScript function parameters, depending on how a function is passed as a parameter I see two different outcomes

我相信我 运行 在将函数作为我的函数的参数传递时遇到了闭包问题。我包括了两个我不太确定会给出不同结果的片段

文件顶部:

let printPizza = () => console.log('pizza')
function closureQuestion(fn) {
 printPizza = () => console.log('hamburger')
 fn()
}

这些必须 运行 按顺序排列,否则 printPizza 会发生变异并且必须重新定义

closureQuestion(printPizza)

^ 记录披萨(不知道为什么)

closureQuestion(() => printPizza())

^ 记录汉堡包

任何帮助将不胜感激,我已经通读了几个闭包示例(只是猜测我正在 运行 进入的内容)但我不理解。

在第一个版本中,您在调用该函数之前printPizza 获得了值。参数fn设置为printPizza的原始值,重新赋值变量对参数没有影响。这与做没有什么不同:

let printPizza = 1;
let fn = printPizza;
printPizza = 2;
console.log(fn); // this will log 1, not 2

在第二个版本中,在执行回调函数之前不会计算 printPizza,因此它将使用变量的最新值。