gpt4 book ai didi

javascript - 函数声明是非静态的吗?

转载 作者:行者123 更新时间:2023-12-04 08:53:40 26 4
gpt4 key购买 nike

我不确定我是否准确地表达了这个问题,但到目前为止,我一直认为 javascript 中的函数声明是“一成不变的”。
当我试图更好地理解闭包(模仿 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 函数返回一个 getter 和一个 setter 作为变量“getX”和“setX”时,“x”到底存储在哪里?在useState的原始声明中?我在这里想念什么?

最佳答案

当一个函数(或任何 block )运行时,一个新的 Environment Record被创建,它本质上是该 block 内使用的变量名称到它们包含的值的映射。如果在 block 完成后可以引用变量名,这就是通常所说的“闭包”。
每次运行函数时,都会创建一个新的此类记录。此记录关闭是您的x被存储。这也是您可以调用 useState 的原因。多次,并将结果分开:

const [getX, setX] = useState(); // Function called; record created
const [getY, setY] = useState(); // Function called again; another record created
以上,自 useState运行两次,您创建了两个环境记录/闭包,每个都有一个单独的绑定(bind) x所以 getXsetX关闭相同 x , 和 getYsetY一起关闭不同的 x .
如果 useState函数永远不会被调用, x没有存储在任何地方,因为 useState 的记录永远不会创建函数。

关于javascript - 函数声明是非静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63964598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com