函数声明是非静态的吗?

Are function declarations non-static?

我不确定我是否准确地表述了问题,但到目前为止,我一直假设 javascript 中的函数声明是 'set in stone'。

当我试图更好地理解闭包(模仿 React 的 useState 的简化版本)时,我开始不确定以下代码块中的 'x' 在内存中的存储位置:

function useState () {
    let x = 0;
    return [function() { console.log(x) },function (y) { x = y}];
}

const [getX, setX] = useState(); 
getX()
setX(1)
getX()

那么当useState函数returns一个getter和一个setter作为变量“getX”和“setX”时,“x”究竟存储在哪里?在 useState 的原始声明中?我在这里错过了什么?

当一个函数(或任何块)运行时,一个新的 Environment Record 被创建,它本质上是一个变量名称 在该块中使用的映射 到值他们包含。如果block结束后变量名还能被引用,这就是通常所说的“闭包”。

每次函数运行时,都会创建一条新的此类记录。此记录关闭是存储您的 x 的地方。这也是为什么您可以多次调用 useState,并将结果分开的原因:

const [getX, setX] = useState(); // Function called; record created
const [getY, setY] = useState(); // Function called again; another record created

以上,由于 useState 运行了两次,您已经创建了 两个 环境记录/闭包,每个都有一个单独的绑定 x 所以 getXsetX 关闭相同的 x,并且 getYsetY 一起关闭不同的 x.

如果从未调用 useState 函数,则 x 不会存储在任何地方,因为从未创建 useState 函数的记录。