函数声明是非静态的吗?
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
所以 getX
和 setX
关闭相同的 x
,并且 getY
和 setY
一起关闭不同的 x
.
如果从未调用 useState
函数,则 x
不会存储在任何地方,因为从未创建 useState
函数的记录。
我不确定我是否准确地表述了问题,但到目前为止,我一直假设 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
所以 getX
和 setX
关闭相同的 x
,并且 getY
和 setY
一起关闭不同的 x
.
如果从未调用 useState
函数,则 x
不会存储在任何地方,因为从未创建 useState
函数的记录。