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

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

提问人:makingithappeninc 提问时间:6/14/2021 更新时间:6/14/2021 访问量:260

问:

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

在文件顶部:

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

这些必须按顺序运行,否则 printPizza 会发生变化,必须重新定义

closureQuestion(printPizza)

^ logs pizza (不知道为什么)

closureQuestion(() => printPizza())

^ 原木汉堡包

任何帮助将不胜感激,我已经阅读了一些闭包示例(只是对我遇到的问题的猜测),但我不明白。

JavaScript 节点 .js ECMASCRIPT-6 闭包

评论

1赞 VLAZ 6/14/2021
在第一种情况下,您可以直接引用打印 .在第二种情况下,您不这样做,并且在调用之前更改将要调用的函数。pizza
0赞 makingithappeninc 6/14/2021
@VLAZ可以详细说明更多?在第二个示例中,我没有使用对函数的引用吗?
1赞 VLAZ 6/14/2021
不是直接参考。你有一个间接的,因为你传递了一个匿名函数,该函数将调用 .但是,可以在正在创建的匿名函数和正在调用的匿名函数之间更改。第一个例子就像给某人一个要打印的文档。文档不会更改 - 打印始终相同。第二个就像给他们一个 URL:将保持不变,但内容可能会改变,因此您打印的内容可能会有所不同。printPizzaprintPizzawww.myDocument.com

答:

2赞 Barmar 6/14/2021 #1

在第一个版本中,你将在调用函数之前获取 的值。该参数设置为 的原始值,重新分配变量对参数没有影响。这与做以下操作没有什么不同:printPizzafnprintPizza

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

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

评论

0赞 Tushar Shahi 6/14/2021
但不是通过引用传递的函数。既然 printPizza纵了,fn() 不应该打印不同的结果吗?
1赞 Felix Kling 6/14/2021
@TusharShahi:JavaScript 是一种按值传递的语言。这与对象是引用类型值无关。
0赞 Tushar Shahi 6/14/2021
@FelixKling使用 '===' 比较 closureQuestions 中的两个函数。他们是平等的。检查 codepen.io/tusharshahi/pen/QWpJreG?editors=1112
2赞 Felix Kling 6/14/2021
@TusharShahi:是的,但这与你问的问题无关。赋值 to 不会更改 的值,因为 JavaScript 是按值传递/赋值的。 获取 的值的副本,它不会获取对变量的引用。printPizzafnfnprintPizzaprintPizza
1赞 Barmar 6/14/2021
您不是在更改对象的属性,而是在分配给变量。这是 和 之间的区别a = 10a.property = 10