JavaScript Closure 从外部作用域更改变量值

JavaScript Closure changing variable value from the outer scope

提问人:Sopo1805 提问时间:4/22/2023 更新时间:4/22/2023 访问量:48

问:

我不明白为什么我返回的函数没有从外部函数更改变量的值。

嗨,我写了js函数:

function num() {
    let number = 0;
    console.log(number)
    return function() {
        return number++
    }
}

然后运行一次。 之后,我运行了多次,它返回了我的带有新值的数字变量,但是当我决定运行函数时,在控制台中它仍然会返回 0,作为数字的值。我不明白为什么会发生这种情况,因为返回的函数不会改变数字的值吗?let add = num()add()num()

JavaScript 函数 闭包 lexical-scope lexical-closures

评论

3赞 Heiko Theißen 4/22/2023
每次调用该函数时,都会创建一个包含新变量和新返回函数的新闭包。num()number

答:

2赞 David 4/22/2023 #1

当我决定运行 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

1赞 Rajkumar S R 4/22/2023 #2

函数中 number 变量的值之所以不变,是因为 number 变量对函数来说是 a,而 by 创建的返回函数由于闭包而访问了这个变量。num()local variablenum()num()

调用 时,将创建一个初始值为 的变量。然后,该函数返回另一个函数,该函数可以通过闭包访问数字变量。此返回的函数每次调用 number 时都会递增 number 的值,并返回新值。num()new number0

因此,当您将返回的函数分配给变量并多次调用它时,闭包中数字变量的值会递增并每次返回。但是,当您再次调用 num() 时,将再次创建一个初始值为 0 的新变量,并且 number 的旧值不受影响。addnumber

如果要更改 num() 函数中 number 的值,可以通过在函数处或函数外部设置变量来修改代码。numberglobal scopenum()

let number = 0;
function num() {
  console.log(number)
  return function() {
      return number++
  }
}

let add = num() // 0 
add()
add()
add()

num() // 3