首页 > 解决方案 > 试图理解 javascript 闭包的问题

问题描述

我一直在尝试理解 JavaScript 中的闭包是如何工作的,但是我在理解它的某些部分时遇到了一些问题。

让我们看看这个例子:

const Component = () => {
    let counter = 0;
    
    const logger = () => {
        console.log(counter);
    }

    setTimeout(() => counter = counter + 10, 1000);

    return logger;
}

const myLogger = Component();

myLogger(); // output after ~1s: 10

当创建“闭包”时,logger函数引用的变量(不是函数的一部分,在这种情况下counter为:),存储在函数的隐藏[[Scope]]属性中,以便函数在执行时可以引用它们。

我认为该[[Scope]]属性具有函数引用的初始值的副本,因为它是一个词法范围。但是在执行我的代码之后,我意识到counter在函数创建之后的值会发生变化。我认为counter应该0在调用之后的值myLogger(),因为它是存储在函数作用域中的初始值,只能在函数内部进行更改。

该操作setTimeout不应增加. 或者至少我是这么认为的。counterlogger

我做错了什么还是我错过了其他东西?

标签: javascriptscopereferenceclosures

解决方案


推荐阅读