提问人:makingithappeninc 提问时间:6/14/2021 更新时间:6/14/2021 访问量:260
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)
^ logs pizza (不知道为什么)
closureQuestion(() => printPizza())
^ 原木汉堡包
任何帮助将不胜感激,我已经阅读了一些闭包示例(只是对我遇到的问题的猜测),但我不明白。
答:
2赞
Barmar
6/14/2021
#1
在第一个版本中,你将在调用函数之前获取 的值。该参数设置为 的原始值,重新分配变量对参数没有影响。这与做以下操作没有什么不同:printPizza
fn
printPizza
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 是按值传递/赋值的。 获取 的值的副本,它不会获取对变量的引用。printPizza
fn
fn
printPizza
printPizza
1赞
Barmar
6/14/2021
您不是在更改对象的属性,而是在分配给变量。这是 和 之间的区别a = 10
a.property = 10
评论
pizza
printPizza
printPizza
www.myDocument.com