提问人:Sopo1805 提问时间:4/22/2023 更新时间:4/22/2023 访问量:48
JavaScript Closure 从外部作用域更改变量值
JavaScript Closure changing variable value from the outer scope
问:
我不明白为什么我返回的函数没有从外部函数更改变量的值。
嗨,我写了js函数:
function num() {
let number = 0;
console.log(number)
return function() {
return number++
}
}
然后运行一次。 之后,我运行了多次,它返回了我的带有新值的数字变量,但是当我决定运行函数时,在控制台中它仍然会返回 0,作为数字的值。我不明白为什么会发生这种情况,因为返回的函数不会改变数字的值吗?let add = num()
add()
num()
答:
当我决定运行 num() 函数时,在控制台中它仍然会返回 0,作为 number 的值
是的。让我们看一下每次调用该函数时执行的前两行代码:num()
let number = 0;
console.log(number)
除了控制台之外,这两行代码不会记录任何内容。0
听起来你想在更高的范围内声明。例如:number
let number = 0;
function num() {
console.log(number);
return function() {
return number++;
};
}
然后,对(或它返回的函数)的任何调用都将使用相同的全局变量。num()
number
函数中 number 变量的值之所以不变,是因为 number 变量对函数来说是 a,而 by 创建的返回函数由于闭包而访问了这个变量。num()
local variable
num()
num()
调用 时,将创建一个初始值为 的变量。然后,该函数返回另一个函数,该函数可以通过闭包访问数字变量。此返回的函数每次调用 number 时都会递增 number 的值,并返回新值。num()
new number
0
因此,当您将返回的函数分配给变量并多次调用它时,闭包中数字变量的值会递增并每次返回。但是,当您再次调用 num() 时,将再次创建一个初始值为 0 的新变量,并且 number 的旧值不受影响。add
number
如果要更改 num() 函数中 number 的值,可以通过在函数处或函数外部设置变量来修改代码。number
global scope
num()
let number = 0;
function num() {
console.log(number)
return function() {
return number++
}
}
let add = num() // 0
add()
add()
add()
num() // 3
评论
num()
number